代码之家  ›  专栏  ›  技术社区  ›  Greg Maletic

iPhone内存管理问题:是否保留迭代的uitableviewcells?

  •  2
  • Greg Maletic  · 技术社区  · 15 年前

    我仍然对内存管理的更微妙的方面感到不安,我对在一些示例代码中看到的积极的保留/释放有一个疑问。明确地:

    - (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]返回的nsarray上的retain(第3行)?数组在该方法调用期间是否保证存在?

    非常感谢。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Ben S    15 年前

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

    您可以安全地删除所有 保持 释放 从代码段调用以执行正确的内存管理。

    另外要注意的是,这实际上并没有多少性能损失。这个 保持 释放 调用只是增加和减少实例的保留计数。

    一般来说,每次你打电话 alloc , copy 保持 你应该打电话 释放 autorelease . 如果你不打电话 同种异体 , 复制 保持 那你就不用用了 释放 自动复位 . 所有Cocoa方法(以及所有与此相关的Objective-C框架)都返回自动发布的对象实例,这样代码就不必看起来像您的代码片段。

    如果你想更多地了解Objective-C中的记忆管理,我建议阅读 Memory Management Programming Guide .