【问题标题】:Is memory released when reference count set to zero?引用计数设置为零时是否释放内存?
【发布时间】:2012-11-24 06:35:18
【问题描述】:

我发现[object_name retain] 将该对象引用计数增加 1,[object_name release] 将该对象引用计数减少 1。[pool drain] 对其引用的所有对象应用释放。

现在我很困惑。当一个对象没有引用时会发生什么? releasedrain 只是减少引用计数,所以内存实际上是在零引用计数时释放的,还是我仍然有一个引用计数为零的对象?

我也在这里找到了

[pool drain] // 使我的 Object str3 引用计数为零

NSLog(@"%li",[str3 length]); // 可以了,对象可能还没有被销毁!

//这里有其他代码

但是

[pool drain]

//这里有其他代码

NSLog(@"%li",[str3 length]); // 不工作,可能现在被销毁了!

【问题讨论】:

  • 去阅读 Apple 的 Cocoa Core Competencies。里面有很多重要的信息,比如:“当保留计数变为零时,对象被释放(销毁)。”
  • 我明白了...系统会自动调用 dealloc 方法来释放零引用计数的对象上的内存空间! ,谢谢大家的意见!

标签: objective-c memory-management reference count


【解决方案1】:

当没有对 then 的强引用时(即当 release 将它们的保留计数降低到 0 时),对象将被释放。

但请记住,-retainCount 方法是无用的,您不应该调用它。

【讨论】:

  • re:关于使用retainCount的建议,我发现以下站点很有用whentouseretaincount.com
  • 我们称之为[object_name retainCount],所以它是实例方法,现在如果我的对象在零引用时被释放。 count ,我怎么还能调用 retainCount 方法?
  • @b_n_​​s:向已释放的对象发送消息是未定义的行为。这意味着任何数量的事情都可能发生。它可能看起来好像该对象仍然存在。看起来您正在向 不同的 对象发送消息。您的程序可能会直接崩溃。可能还有其他事情。发生的事情几乎是一个废话。在您的测试中,看起来对象仍然存在,但那是因为您正在调用未定义的行为。这不会可靠地发生。
  • @AnoopVaidya:不,这根本不对。除了nil 之外,没有任何对象会为其保留计数返回 0。这是因为只有被破坏的对象的保留计数才会为 0,但向被破坏的对象发送消息是非法的。正如 Catfish_Man 所指出的,retainCount 几乎没用。它当然不能告诉你一个对象是否被释放。
【解决方案2】:

我认为该对象将在零保留计数后被销毁,并且不能再使用。更多详情请参考here

【讨论】:

  • 是的..但是有什么方法可以检查我的对象是否从内存中释放? ,因为我仍然可以使用引用计数为零的对象调用实例方法 retainCount。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多