ARC를 사용하는 iPhone 응용 프로그램을 만들고 있는데, 상황이 있습니다.ARC를 사용하여 iOS에서 자동 릴리즈 된 객체를 처리하는 방법
응용 프로그램의 각 페이지에서 웹 서비스 호출이 발생하고 있습니다. 그리고이 방법에서는 서버에서 새 값을 추가하기 전에 배열에서 모든 객체를 제거합니다. 모두 잘 작동하지만 때로는 앱이 [self.myArray removeAllObjects]
에 충돌합니다.
은 내가 myArray의
내가 ARC, 객체, myArray
를 사용하고 같은 내가 생각하고하는 것은,이다 @property (strong, nonatomic) NSMutableArray myArray;
에 대한 @property 설정 한, 어느 시점에서 발표와 나는 같은 모든 개체를 제거하려고 받고 있습니다 정렬. 그 충돌을 일으키는, 나는 확실하지 않다 그러나 나는 이것을위한 다른 어떤 이유를 보지 않는다.
그래서 객체를 제거하기 전에 배열 유효 여부를 확인하려고했습니다. 다른 시나리오를 확인하기 위해 샘플 코드를 작성했습니다. 여기에 있습니다 :
NSMutableArray *testArray = [[NSMutableArray alloc]initWithObjects:@"1", @"2", @"3", @"4", nil];
if (testArray) {
NSLog(@"i am alive");
}
[testArray release];
if (testArray) { //here how to check whether this array is valid or not?
NSLog(@"i am alive: %@", testArray);
}else{
NSLog(@"I am dead");
testArray = [[NSMutableArray alloc]initWithObjects:@"5", @"6", @"7", @"8", nil];
}
[testArray release];
[testArray removeAllObjects];
나는 그것이 충돌을 일으킬 것이라는 것을 알고 있지만 점검 만하기위한 것입니다. 여기, 배열 유효 여부를 어떻게 확인할 수 있습니까? 이것이 올바른 접근인가 아니면 다른 것입니까?
안내해주세요.
감사합니다.
실제 코드 :
- (void)getFriendsList{
BOOL netIsAvailable = [self connected];
if (netIsAvailable) {
@try {
NSString *accessToken = [self getAccessToken];
NSString *tokenEncoded = [accessToken stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *finalUrl = [NSString stringWithFormat:@"%@FriendsnSongs/%@",CommonWebServiceUrl,tokenEncoded];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:finalUrl] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *currentResult = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// NSString* responseString = [[NSString alloc] initWithData:currentResult encoding:NSUTF8StringEncoding];
if (currentResult != nil) {
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:currentResult
options:kNilOptions
error:&error];
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
int statusCode = [httpResponse statusCode];
NSMutableArray *match = [json valueForKey:@"FriendsnSongsResult"];
if (statusCode == 200) {
if (self.userGuidArray) {
[self.albumNameArray removeAllObjects]; //here got crash
[self.artistNameArray removeAllObjects];
[self.deviceNameArray removeAllObjects]; //here also got crash once
[self.nickNameArray removeAllObjects];
[self.userProfileImageArray removeAllObjects];
[self.songTitleArray removeAllObjects];
[self.songStatusArray removeAllObjects];
[self.userGuidArray removeAllObjects];
}
for(NSArray *player in match) {
[self.albumNameArray addObject:[(NSArray *)player valueForKey:@"AlbumName"]];
[self.artistNameArray addObject:[(NSArray *)player valueForKey:@"Artist"]];
[self.nickNameArray addObject:[(NSArray *)player valueForKey:@"NickName"]];
[self.userProfileImageArray addObject:[(NSArray *)player valueForKey:@"ProfileImage"]];
[self.songStatusArray addObject:[(NSArray *)player valueForKey:@"Status"]];
[self.songTitleArray addObject:[(NSArray *)player valueForKey:@"Title"]];
[self.userGuidArray addObject:[(NSArray *)player valueForKey:@"UserGuid"]];
[self.deviceNameArray addObject:[(NSArray *)player valueForKey:@"DeviceName"]];
}
//Start timer for updating the friends list
if (timerActivated)
[self performSelectorOnMainThread:@selector(backgroundFriendsListUpdate) withObject:nil waitUntilDone:NO];
//Update table if the table not in search mode
if (!isSearching)
[self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:YES];
}
}
}
@catch (NSException *exception) {
NSLog(@"Exception: %@",exception.name);
}
}
[DejalActivityView removeView];
}
그리고 중요한 점은이 클래스에서 백그라운드 스레드는 30 초마다 실행된다. 테이블을 새로 고치는 것과 동일한 메소드를 호출합니다.
wt는 오류이며 왜 testArray release를 사용합니까?]; 심지어 ARC를 사용하는 U? – iPatel
일단 출시되면 더 이상 아무것도 테스트 할 수 없습니다. 나는 그 문제의 근원지에 춤추 기보다는 오히려 그 뿌리에 다가 서기를 더 좋아할 것입니다. – Bushbert
@iPatel이 샘플 코드에서는 ARC를 사용하지 않고 있습니다. 객체가 유효한지 또는 릴리스 이후인지를 확인하기 위해서만 작성했습니다. – Mithuzz