【问题标题】:iPhone memory management question: retaining iterated UITableViewCells?iPhone内存管理问题:保留迭代的UITableViewCells?
【发布时间】:2009-12-11 20:57:34
【问题描述】:

我仍然对内存管理的微妙方面感到不安,并且我对我在一些示例代码中看到的激进的保留/释放有疑问。具体来说:

- (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 上保留?数组在此方法调用期间是否保证存在?

非常感谢。

【问题讨论】:

    标签: iphone memory-management


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好的,谢谢。我觉得我对内存管理有相当多的了解,但是当我看到这样的代码时,我开始怀疑。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多