gpt4 book ai didi

iPhone内存管理问题: retaining iterated UITableViewCells?

转载 作者:行者123 更新时间:2023-12-03 21:12:54 25 4
gpt4 key购买 nike

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

- (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.tableViewvisibleCells] 返回的 NSArray(第 3 行)?数组是否不能保证在此方法调用期间一直存在?

非常感谢。

最佳答案

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

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

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

作为一般规则,每次调用 alloccopyretain 时,都应该调用 release自动释放。如果您不调用 alloccopyretain 那么您不需要使用 release自动释放。所有 Cocoa 方法(以及与此相关的所有 Objective-C 框架)都会返回自动释放的对象实例,因此此代码不必看起来像您的代码片段。

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

关于iPhone内存管理问题: retaining iterated UITableViewCells?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com