iPhone内存管理问题:保留迭代的UITableViewCells?

时间:2009-12-11 20:57:34

标签: iphone memory-management

我对内存管理的微妙方面仍然不稳定,我对一些示例代码中看到的积极保留/释放有疑问。具体做法是:

- (void)loadContentForVisibleCells
{
    NSArray *cells = [self.tableView visibleCells];
    [cells retain];
    for (int i = 0; i < [cells count]; i++) 
    { 
        // Go through each cell in the array and call its loadContent method if it responds to it.
        FlickrCell *flickrCell = (FlickrCell *)[[cells objectAtIndex: i] retain];
        [flickrCell loadImage];
        [flickrCell release];
        flickrCell = nil;
    }
    [cells release];
}

为什么[保留/释放]循环在FlickrCell上(第8行和第10行)?该单元格位于NSArray中,根据定义,它保留了其内容(我认为......?),并保留了NSArray本身。为什么这个额外的保留是必要的?

此外,为什么NSArray上的保留由[self.tableView visibleCells](第3行)返回?在此方法调用的持续时间内,数组是否保证不会出现?

非常感谢。

1 个答案:

答案 0 :(得分:2)

在这种情况下,retain / release不是必需的,因为返回的单元格实际上是自动释放的。 retain数组上的额外release / cells也是如此。

您可以安全地从代码段中删除所有retainrelease来电,以执行正确的内存管理。

另请注意,这并没有太大的性能损失。 retainrelease调用只是递增和递减实例的保留计数。

作为一般规则,每次拨打alloccopyretain时,都应致电releaseautorelease。如果您不致电alloccopyretain,则无需使用releaseautorelease。所有Cocoa方法(以及所有Objective-C框架)返回自动释放的对象实例,因此此代码不必看起来像您的代码段。

如果您想了解有关Objective-C内存管理的更多信息,建议您阅读Memory Management Programming Guide