【问题标题】:How many times do I release an allocated or retained object?我释放分配或保留的对象多少次?
【发布时间】:2011-04-13 10:45:08
【问题描述】:

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

我的问题是:

我是否只检查retainCount 是否大于零然后释放它?

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

我是否应该像retainCount一样多次发布它

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

感谢您的帮助!

【问题讨论】:

  • 任何对象的retainCount与您无关。它是作为调试帮助的,但仅此而已。生产代码永远不应该依赖它。
  • 顺便说一句——并不是说它使代码正确——但是,根据定义,retainCount 永远不会返回 0,因为在发生这种情况时对象已经被释放.....
  • 另外,尝试使用“构建和分析”(即 Clang 分析器)。它可能会指出你哪里出了问题。

标签: iphone memory-management cocos2d-iphone retain retaincount


【解决方案1】:

不要使用 -retainCount。

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

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

详情请参阅Memory Management Guidelines

【讨论】:

  • 你应该在某处纹身。
  • @bbum: rdar://8122368(openradar.appspot.com/8122368 对于我们所有非苹果用户)
  • 到目前为止我还没有使用retainCount,但我想知道我是否应该。感谢您清除 :) 当玩家在游戏中死亡时,我正在分配前景图像。现在,如果玩家完成关卡而没有死掉整个关卡,那么在 dealloc 中我如何检查我是否应该释放前景。我是否只使用一个标志来检查前景是否被使用?
  • @abhinav 如果你只在玩家死亡时创建图像,那么这意味着指针是 nil 否则,对吗?那么如何检查指针是否为nil,或者直接执行[myImage release](因为如果myImagenil,这是一个无操作)。
  • 如果您从未在实例变量中存储过任何内容,那么它将为零。将 release 发送到 nil 是无害的。所以就做[前台发布];前景 = nil;.
【解决方案2】:

自动释放使retainCount 毫无意义。跟踪保留以及您是否拥有对象。学习并记住这些规则:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多