Cómo manejar objects autoelegidos en iOS con ARC

Estoy creando una aplicación de iPhone con ARC habilitado, en esto estoy teniendo una situación.

En cada página de la aplicación, está sucediendo una llamada de service web. Y en este método, elimino todos los objects de las matrices antes de agregar un nuevo valor al server. Todo funciona bien, pero a veces la aplicación se bloquea en [self.myArray removeAllObjects] .

He establecido @property para myArray @property (strong, nonatomic) NSMutableArray myArray;

Lo que estoy pensando es que, como estoy usando ARC, el object, myArray , se liberó en algún momento e bash eliminar todos los objects de la misma matriz. Que causando el crash, no estoy seguro, pero no veo ninguna otra razón para esto.

Entonces, estaba pensando en verificar si la matriz es válida antes de eliminar los objects. Escribí un código de muestra para verificar los diferentes escenarios. Aquí está:

 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]; 

Sé que causará fallas, pero es solo para verificar. Aquí, ¿cómo puedo verificar si la matriz es válida? ¿Es este un enfoque correcto o algo más?

Por favor guíame.
Gracias.

Código real:

 - (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]; } 

Y el punto importante es que en esta class se ejecuta un subprocess de background cada 30 segundos. Llamará a este mismo método para actualizar la tabla.

Como sugirió en los comentarios, usar una matriz temporal es una buena idea. El siguiente código llenará una matriz temporal y la usará para replace su matriz en el hilo principal.

 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; }); 

Si está usando ARC continuación [testArray release]; esta línea de su código porque ARC maneja . De lo contrario [testArray release]; write in -(void)dealloc method.

Da la condición antes de eliminar el valor de Array

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

Y luego inserte datos en myArray .