tableView:cellForRowAtIndexPath 的保留计数:
Posted
技术标签:
【中文标题】tableView:cellForRowAtIndexPath 的保留计数:【英文标题】:Retain count for tableView:cellForRowAtIndexPath: 【发布时间】:2010-08-11 17:20:33 【问题描述】:在 Apple 的示例代码中,UITableViewDataSource
的方法 tableView:cellForRowAtIndexPath:
返回一个保留计数为 1 的单元格;它分配它,但不自动释放它。但是,静态分析器抱怨这违反了 Cocoa 命名约定,因为方法名称不以“new”等开头。文档没有提到单元格的预期保留计数。单元格应该有多少保留计数?我应该针对文档提交错误吗?谢谢。
编辑:我查看的示例代码确实自动释放它,但我的眼睛不知何故跳过了它。很抱歉浪费您的时间。感谢您的回复。
进一步编辑:如果提问者会因为在问题中使用 Clang 的术语而感到兴奋,那么可能应该针对 Clang 提交一个错误。 :-)
【问题讨论】:
【参考方案1】:retainCount
的值并不是很重要(它可能会因为看似未知的原因而上下波动)。但是在tableView:cellForRowAtIndexPath:
中创建的单元格应该是自动释放的。你在看什么示例代码?
【讨论】:
Clang SA 使用“保留计数为 1”表示“由堆栈的当前位拥有”,即[foo retain]
和 [[Foo alloc] init]
的保留计数为 1,而 [[foo retain] autorelease]
和 @987654326 @ 保留计数为 0。
@tc。这很有趣——但可能是有问题的术语。【参考方案2】:
哪个示例代码? MyTableViewController.m 返回[tableView dequeueReusableCellWithIdentifier:kCellID]
或[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease]
。
如果示例代码做了不同的事情,那可能是错误的。几乎所有方法都遵循 Objective-C 命名约定;那些不会被明确记录的。
【讨论】:
【参考方案3】:保留计数总是至少为 1。您将永远无法取回保留计数小于该值的对象,它已经是前对象。请不要从保留计数中得出结论,或者对它们抱有期望,甚至永远不要看它们。从来没有从来没有从来没有。
可能到处都有不可靠的示例代码做错事。忽略它。做正确的事,不要为其他事情烦恼。
【讨论】:
【参考方案4】:事实上,根本不要使用 retainCount。我很困惑,它把我引向了完全错误的方向,我浪费了几天时间寻找错误的漏洞。如果计数上升或下降,这绝对没有任何意义!不要浪费一秒钟的时间来处理它。
最好使用 Leak 或 Zombie 工具!
(也感谢 walkytalky - 我刚刚看到他也回答了这个问题!)
【讨论】:
【参考方案5】:不用担心保留计数。你alloc
UITableViewCell
在你的cellForRowAtIndexPath:
,这意味着你必须释放它,否则你有内存泄漏。您不能释放它,因为您必须返回单元格,让表格视图将其绘制为子视图,然后释放它。因此,您 autorelease
它让自动释放池稍后释放它。当您返回它时,它还没有被释放,但稍后会被系统释放(您只是放弃了它的所有权,这就是您想要的,因为您在返回后不维护对单元格的引用从函数)。
【讨论】:
以上是关于tableView:cellForRowAtIndexPath 的保留计数:的主要内容,如果未能解决你的问题,请参考以下文章