Objective C - UITableView在调用reloadData后我的对象属性为null / nil

时间:2010-10-09 16:28:50

标签: objective-c uitableview nsurlconnection reloaddata

我有一个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之后保留部分的值。

非常感谢。

2 个答案:

答案 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得到的任何东西: