0

在 Apple 的示例代码中,tableView:cellForRowAtIndexPath:a的方法UITableViewDataSource返回一个保留计数为 1 的单元格;它分配它,但不自动释放它。但是,静态分析器抱怨这违反了 Cocoa 命名约定,因为方法名称不以“new”开头,等等。文档没有提到单元格的预期保留计数。单元格应该有多少保留计数?我应该针对文档提交错误吗?谢谢。

编辑:我查看的示例代码确实自动释放它,我的眼睛不知何故跳过了它。很抱歉浪费您的时间。感谢您的回复。

进一步编辑:如果提问者会因为在问题中使用它的术语而感到兴奋,那么可能应该针对 Clang 提交一个错误。:-)

4

5 回答 5

3

的值retainCount并不重要(它可能会因为看似未知的原因而上下波动)。但是在其中创建的单元格tableView:cellForRowAtIndexPath:应该是自动释放的。你在看什么示例代码?

于 2010-08-11T17:26:05.703 回答
2

哪个示例代码?MyTableViewController.m 返回[tableView dequeueReusableCellWithIdentifier:kCellID][[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease]

如果示例代码做了不同的事情,那可能是错误的。几乎所有方法都遵循 Objective-C 命名约定;那些不倾向于被明确记录的。

于 2010-08-11T17:28:46.867 回答
0

保留计数始终至少为 1。您永远不会取回保留计数小于该值的对象,它已经是前对象。请不要从保留计数中得出结论,或者对它们抱有期望,甚至永远不要看它们。从来没有,从来没有,从来没有。

可能到处都有不可靠的示例代码做错事。忽略它。做正确的事,不要为其他事情烦恼。

于 2010-08-11T17:32:33.800 回答
0

事实上,根本不要使用 retainCount。我很困惑,它把我引向了完全错误的方向,我浪费了几天时间寻找错误的漏洞。如果计数上升或下降,这绝对没有任何意义!不要浪费一秒钟的时间来处理它。

最好使用 Leak 或 Zombie 工具!

(ps也感谢walkytalky——我刚刚看到他也回答了这个问题!)

于 2010-08-11T17:34:28.320 回答
0

不要担心保留计数。你allocUITableViewCell你的cellForRowAtIndexPath:,这意味着你必须释放它,否则你有内存泄漏。您不能释放它,因为您必须返回单元格,让表格视图将其绘制为子视图,然后释放它。因此,您autorelease可以让自动释放池稍后释放它。当你返回它时,它还没有被释放,但稍后会被系统释放(你只是放弃了它的所有权,这就是你想要的,因为你在返回后不维护对单元格的引用从函数)。

于 2010-08-11T17:37:15.197 回答