我有一个ViewController定义如下:
@interface SectionController : UITableViewController {
NSMutableArray *sections;
}
- (void) LoadSections;
当调用LoadSection时,它调用NSURLConnection来加载一个url,而url又调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[connection release];
[responseData release];
NSDictionary *results = [responseString JSONValue];
NSMutableArray *jSections = [results objectForKey:@"Items"];
sections = [NSMutableArray array];
for (NSArray* jSection in jSections)
{
Section* section = [Section alloc];
section.Id = [jSection objectForKey:@"Id"];
section.Description = [jSection objectForKey:@"Description"];
section.Image = [jSection objectForKey:@"Image"];
section.Parent = [jSection objectForKey:@"Parent"];
section.ProductCount = [jSection objectForKey:@"ProductCount"];
[sections addObject:section];
[section release];
}
[jSections release];
[results release];
[delegate sectionsLoaded];
[self.view reloadData];
}
数据正确分析,现在我的部分填充了很多项目。
调用[self.view reloadData]强制回调委托方法cellForRowAtIndexPath,然后将该数据呈现给单元格,但此时 sections 现在再次为nil。
有人可以指出我的错误吗?我必须承认我是目标c的新手,它可能是一个指针问题。需要做的是在调用reloadData之后保留部分的值。
非常感谢。
答案 0 :(得分:1)
看到新代码问题显而易见:
sections = [NSMutableArray array];
应该成为
[sections release];
sections = [[NSMutableArray alloc] init];
请注意,数组不会再次变为“nil”,而是取消分配并获得无效引用,这可能(应该)在解除引用时生成崩溃。
我建议你阅读一些有关引用计数内存管理的文章,因为如果你是Objective-C的新手可能并不明显,并且经常导致错误(即:自动释放根本不是魔法)
答案 1 :(得分:0)
避免所有内存泄漏的最佳方法只是使用@property (nonatomic, retain) NSMutableArray *sections;
使用属性,您可以确保所有人员管理工作都将由系统正确管理。在执行setSections:时,不要忘记该属性会保留值,因此您需要在此处传递自动释放的对象。
self.sections = [NSMutableArray array];
...
[self.sections addObject:section];
另外要避免所有问题,请尝试使所有应该仅在此方法中生存的对象自动释放。像这样:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *responseString = [[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] autorelease];
NSDictionary *results = [responseString JSONValue];
NSMutableArray *jSections = [results objectForKey:@"Items"];
self.sections = [NSMutableArray array];
for (NSArray* jSection in jSections) {
Section* section = [[[Section alloc] init] autorelease];
section.Id = [jSection objectForKey:@"Id"];
section.Description = [jSection objectForKey:@"Description"];
section.Image = [jSection objectForKey:@"Image"];
section.Parent = [jSection objectForKey:@"Parent"];
section.ProductCount = [jSection objectForKey:@"ProductCount"];
[self.sections addObject:section];
}
[delegate sectionsLoaded];
[self.view reloadData];
}
您尝试发布的大多数对象已经自动释放: 所有传递给你方法的参数都不应该手动释放,检查我认为JSONValue也应该返回自动释放的对象以及你通过枚举或通过调用objectForKey得到的任何东西: