2009-12-11 91 views
2

我仍然对内存管理的一些微妙方面感到不安,我有一个关于我在某些示例代码中看到的积极保留/释放的问题。具体做法是:iPhone内存管理问题:保留迭代的UITableViewCells?

- (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本身。为什么这些额外的保留是必要的?

此外,为什么保留在[self.tableView visibleCells](第3行)返回的NSArray上?在这个方法调用期间,数组是否保证不在?

非常感谢。

回答

2

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

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

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

一般来说,每次调用alloccopyretain时候你应该叫releaseautorelease。如果您不拨打alloc,copyretain,则不需要使用releaseautorelease。所有的Cocoa方法(以及所有Objective-C框架)都会返回自动释放的对象实例,以便该代码不必看起来像你的代码片段。

如果您想了解Objective-C中内存管理的更多信息,建议您通过Memory Management Programming Guide进行阅读。

+0

好的,谢谢。我觉得我对内存管理有相当的了解,但是当我看到这样的代码时,我开始怀疑。 – 2009-12-11 22:05:56