2010-08-11 65 views
0

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

编辑:我看的示例代码autorelease它,我的眼睛不知何故跳过它。对不起,浪费你的时间。感谢您的回应。

进一步修改:如果提问者在某个问题中使用它的术语会被跳过,那么应该对Clang提出一个错误。 :-)

回答

3

retainCount的值并不重要(因为看似未知的原因,它可能会升高和降低)。但tableView:cellForRowAtIndexPath:中创建的单元格应该是自动释放的。你在看什么样的代码?

+2

Clang SA使用“retain count of 1”来表示“由当前位栈拥有”,即'[foo retain]'和'[[Foo alloc] init]'保留计数为1,而' [foo retain] autorelease]和[[[[Foo alloc] init] autorelease]'保留计数为0. – 2010-08-11 17:32:40

+0

@tc。这很有趣 - 但也许有问题的术语。 – walkytalky 2010-08-11 17:42:05

+0

没错,只是使用了Clang的术语。 – 2010-08-11 18:53:28

2

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

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

0

保留计数为总是至少为1.您将永远不会收回保留计数小于该值的对象,它已经是前一个对象。请请不要从保留计数中得出结论,或者对他们有期望,甚至不要看他们。永远永远永远永远永远永远

在这里和那里可能会有一些可怕的示例代码来做错误的事情。忽略它。做正确的事情,不要为其余的烦恼。

0

事实上,请不要使用retainCount。我感到非常困惑,并且导致我陷入了完全错误的方向,而且我几乎浪费了时间来查找错误的泄漏。这意味着绝对没有什么,如果计数升高或降低!不要浪费一秒钟处理它。

使用Leak或Zombie工具好多了!

(PS还多亏是WalkyTalky - 正如我刚才看到他还回答了这一个!)

0

不要担心保留计数。你的alloc a UITableViewCell在你的cellForRowAtIndexPath:,这意味着你必须释放它或者你有内存泄漏。你不能释放它,因为你必须返回单元格,让表格视图把它作为子视图,然后释放它。因此你需要autorelease它让autorelease池在稍后发布。当你返回它时,它还没有被释放,但是被系统稍后释放(你只是放弃了它的所有权,这是你想要的,因为你没有在它返回之后保持对单元的引用来自函数)。

相关问题