2011-05-11 1 views
1

J'ai problème avec le code ci-dessous une fuite de mémoire ...MemoryManagement lors de l'obtention d'un NSMutableArray de la classe NSObject à la classe UIViewController

@property (nonatomic, retain) NSMutableArray *childrensArray; 


-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 

NSLog(@"Connection finished loading."); 
// Dismiss the network indicator when connection finished loading 
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

// Parse the responseData of json objects retrieved from the service 
SBJSON *parser = [[SBJSON alloc] init]; 

NSString *jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
NSDictionary *jsonData = [parser objectWithString:jsonString error:nil]; 
childrensArray = [jsonData objectForKey:@"Children"]; 

// Callback to AttendanceReportViewController that the responseData finished loading 
[attendanceReportViewController loadChildren]; 

[connection release]; 
[responseData release]; 
[jsonString release]; 
[parser release]; 
} 

Dans le viewController ce qui suit fuites mémoire aussi ...

@property (nonatomic, retain) NSMutableArray *childrensArray; 


- (void)loadChildren { 

// Retrieve a array with dictionaries of children from ServiceGetChildren 
self.childrensArray = [[serviceGetChildren.childrensArray copy] autorelease]; 

int total = [childrensArray count]; 
totalLabel.text = [NSString stringWithFormat:@"%d", total]; 

[theTableView reloadData]; 
} 
+1

pourriez-vous nettoyer le code de vos messages, s'il vous plaît. – toto

+0

Je dis juste, mais ... après votre ligne de fuites ('childrensArray = [serviceGetChildren.childrensArray copy];' vous avez un '{' au lieu d'un '}'. Aussi, j'espère que ce n'est pas entièrement copier collé en une seule fois, mais copier collé en pièces, non? Parce que si la mise en page est exactement la même, il y a plus .. ahum, les choses, mal – Joetjah

+0

@toto oui bien sûr désolé pour cela. Maintenant, probablement plus facile à lire – Silversnail

Répondre

1

Vous ne publiez que childrensArray lorsque l'instance est désallouée. Vous devez également libérer la variable d'instance avant de le placer:

- (void)loadChildren { 
    // Retrieve a array with dictionaries of children from ServiceGetChildren 
    [childrensArray release]; 
    childrensArray = [serviceGetChildren.childrensArray copy]; 
} 

Une meilleure façon serait d'utiliser réellement votre propriété:

- (void)loadChildren { 
    // Retrieve a array with dictionaries of children from ServiceGetChildren 
    self.childrensArray = [[serviceGetChildren.childrensArray copy] autorelease]; 
} 

(Notez que le autorelease)

Ceci a l'avantage de déclencher des notifications KVO si jamais vous les utilisez.

+0

Un autre problème est 'childrensArray = [jsonData objectForKey: @" Children "];', qui est en train d'écraser la variable d'instance childrensArray sans la relâcher.Une variable temporaire devrait être utilisée à la place – Tony

+0

Ok, si je le fais self.childrensArray = [ [serviceGetChildren.childrensArray copy] autorelease]; \t Je n'ai pas besoin de le libérer en dealloc? – Silversnail

+0

@Tony Ok, mais si j'utilise une variable temporaire, comment Puis-je le récupérer depuis viewController? Est-ce que je mets encore sa propriété? Ou comment voulez-vous dire? – Silversnail

Questions connexes