2010-09-16 62 views
6

我正在制作一款iPhone游戏。我想释放已分配或保留的所有对象。在dealloc函数中,我释放了所有这样的对象,但后来我意识到有时我最终会在尚未分配对象时释放对象。所以我想我需要检查其retainCount是否大于零或不释放它之前。我释放分配或保留的对象多少次?

我的问题是:

难道我只是检查是否retainCount大于零,然后再释放?

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

我应该释放它多次作为其retainCount

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

感谢您的帮助!

+23

任何对象的'retainCount'都是**您的业务**。它在那里作为一种调试手段,但仅此而已。生产代码永远不应该依赖它。 – Sven 2010-09-16 21:11:00

+9

顺便说一句 - 不是它使代码正确 - 但根据定义,'retainCount'永远不会返回0,因为该对象已被释放的时间发生..... – bbum 2010-09-16 21:14:22

+0

此外,请尝试使用“构建&分析“(即Clang分析器)。它可能会指出你出错的地方。 – 2010-09-17 00:18:14

回答

77

请勿使用-retainCount。

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

您应该致电release完全相同的次数导致对象被保留。没有更少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。

查看Memory Management Guidelines的全部细节。

+10

你应该在某处纹身。 – 2010-09-16 21:11:44

+4

@bbum:rdar:// 8122368(http://openradar.appspot.com/8122368对于我们所有的非苹果人) – 2010-09-16 21:20:07

+0

我还没有使用retainCount到目前为止,但想知道如果我应该。感谢您的清除:) 当玩家在游戏中死亡时,我正在分配前景图像。现在,如果玩家完成关卡而不死于整个关卡,那么在dealloc中,我该如何检查是否应该释放前景。我只是用旗子来检查foregrounf是否被使用过? – abhinav 2010-09-16 21:31:02

相关问题