我需要释放一个已分配或保留的对象多少次?

7
我正在开发一个iPhone游戏。我想释放所有已分配或保留的对象。在dealloc函数中,我释放了所有这样的对象,但后来我意识到有时候我会在它们还没有被分配时就将其释放掉。所以我想在释放之前先检查它的retainCount是否大于零。
我的问题是:
我只需要检查retainCount是否大于零,然后将其释放吗?
if([bg retainCount]!=0)
{
  [bg release];
}

或者

我应该将其发布与其retainCount相同的次数吗?

while([bg retainCount]!=0)
{
  [bg release];
}

感谢您的帮助!

23
任何对象的 retainCount(引用计数)都不是你需要关心的事情。它只是一个调试工具而已,不能被用于生产代码中。请勿依赖它。 - Sven
9
顺便说一句 - 这并不意味着代码是正确的 - 但根据定义,retainCount永远不可能返回0,因为此时对象已经被释放掉了。 - bbum
此外,试试使用“构建和分析”(即Clang分析器)。它可能会向您指出您何处出错。 - Johan Kool
2个回答

78

不要使用-retainCount。

对象的绝对保留计数是没有意义的。

你应该调用release的次数与你导致对象被保留的次数完全相同。不少(除非你喜欢泄漏),当然也不能多(除非你喜欢崩溃)。

详细信息请参见内存管理指南


10
你应该在某个地方纹上那个图案。 - user23743
4
@bbum: rdar://8122368 (http://openradar.appspot.com/8122368 适用于所有非苹果公司的人)。 意思是:@bbum提到一个问题编号为8122368的bug,链接为http://openradar.appspot.com/8122368,这个链接适用于所有不是苹果公司的人。 - Dave DeLong
到目前为止我还没有使用过retainCount,但是我在想是否应该用它。谢谢你的解答 :)在游戏中,当玩家死亡时,我会分配一个前景图像。现在,如果玩家完成整个级别而没有死亡,那么在dealloc中,我如何检查是否应该释放前景。我只需使用标志来检查是否使用了前景吗? - abhinav
1
如果只在玩家死亡时创建图像,那么指针就应该是nil,对吗?那么怎么检查指针是否为nil,或者直接执行[myImage release](因为如果myImagenil,这将不起作用)。 - Dave DeLong
@Dave DeLong和tewha:那就是我一直在做的,但是遇到了一些崩溃问题。那时候我开始怀疑这样做是否正确。感谢你们澄清了这个问题。 - abhinav
显示剩余5条评论

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接