Управление памятью при получении NSMutableArray из класса NSObject в класс UIViewController - PullRequest
1 голос
/ 11 мая 2011

У меня проблема со следующим кодом утечки памяти ...

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

В viewController следующее также приводит к утечке памяти ...

@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 Ответ

1 голос
/ 11 мая 2011

Вы отпускаете childrensArray только тогда, когда экземпляр освобожден. Вы также должны освободить переменную экземпляра перед установкой:

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

Лучшим способом было бы фактически использовать вашу собственность:

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

(обратите внимание на autorelease)

Преимущество заключается в том, что вы можете запускать KVO-уведомления, если вы когда-либо их используете.

...