2013-03-19 1 views
3

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 초마다 실행된다. 테이블을 새로 고치는 것과 동일한 메소드를 호출합니다.

+0

wt는 오류이며 왜 testArray release를 사용합니까?]; 심지어 ARC를 사용하는 U? – iPatel

+0

일단 출시되면 더 이상 아무것도 테스트 할 수 없습니다. 나는 그 문제의 근원지에 춤추 기보다는 오히려 그 뿌리에 다가 서기를 더 좋아할 것입니다. – Bushbert

+0

@iPatel이 샘플 코드에서는 ARC를 사용하지 않고 있습니다. 객체가 유효한지 또는 릴리스 이후인지를 확인하기 위해서만 작성했습니다. – Mithuzz

답변

1

의견에서 제안했듯이 임시 배열을 사용하는 것이 좋습니다. 다음 코드는 임시 배열을 채우고이를 사용하여 주 스레드에서 배열을 대체합니다.

NSMutableArray *tempAlbumArray = [NSMutableArray array]; 
//fill your array 
[tempAlbumArray addObject:<#some object#>]; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    //replace your array with the new one 
    //this code will be executed in main thread 
    self.albumNameArray = tempAlbumArray; 
}); 
+0

고맙습니다. 말씀 드린대로 코드를 사용해 보겠습니다. – Mithuzz

+0

현재 앱이 정상적으로 실행 중이므로 문제가 해결되기를 바랍니다. 감사. – Mithuzz

4

당신이 다음 코드에서 [testArray release];이 줄을 제거 ARC를 사용하는 경우 ARC 핸들 때문에. 그렇지 않으면 [testArray release];-(void)dealloc 방법으로 씁니다.

가지 적어 조건은 이전

if(myArray.count > 0)// because sometime it is good logic for us. 
    [myArray removeAllObjects]; 

배열 값

를 제거한 다음 myArray에 데이터를 삽입합니다.

+0

나는 이것도 시험해 보았지만 여전히 나는 추락했다. 그리고 배열을 릴리즈하기 전과 릴리즈하기 전에 어레이의 카운트를 NSLog에 시도했는데 같은 카운트를 얻었고 0이 아니 었습니다. 그래서, 우리가 배열을 릴리스 한 후에도 카운트는 동일 할 것입니다. ?? – Mithuzz

+0

@ Mithuzz- 무게가 잘못되었다는 것을 알려주시겠습니까 ??? – iPatel

+0

예외 중단 점을 추가하여 [self.myArray removeAllObjects];에서 오류가 발생했습니다. 또한 try 및 catch도 사용 했으므로 예외 부분에서는 NSRangeException 예외가 발생했습니다. – Mithuzz

관련 문제