我对内存管理的微妙方面仍然不稳定,我对一些示例代码中看到的积极保留/释放有疑问。具体做法是:
- (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行)返回?在此方法调用的持续时间内,数组是否保证不会出现?
非常感谢。
答案 0 :(得分:2)
在这种情况下,retain
/ release
不是必需的,因为返回的单元格实际上是自动释放的。 retain
数组上的额外release
/ cells
也是如此。
您可以安全地从代码段中删除所有retain
和release
来电,以执行正确的内存管理。
另请注意,这并没有太大的性能损失。 retain
和release
调用只是递增和递减实例的保留计数。
作为一般规则,每次拨打alloc
,copy
或retain
时,都应致电release
或autorelease
。如果您不致电alloc
,copy
或retain
,则无需使用release
或autorelease
。所有Cocoa方法(以及所有Objective-C框架)返回自动释放的对象实例,因此此代码不必看起来像您的代码段。
如果您想了解有关Objective-C内存管理的更多信息,建议您阅读Memory Management Programming Guide。