【问题标题】:iphone memory management issueiphone内存管理问题
【发布时间】:2009-03-13 09:16:45
【问题描述】:

如何判断一个对象是否已从内存中释放?

我知道当我们使用 alloc|copy|retain 来创建对象时,必须手动释放该对象。如果使用实例类方法(NSString stringwithformat:),对象会被NSAutoRealeasePool自动释放,但是,有时在(void)dealloc函数那里有一些对象用于释放。

谁能告诉我

  1. [object release][object release](void)deallocNSAutoReleasePool释放对象有什么区别?

  2. (void)dealloc函数什么时候被调用,NSAutoReleasePool什么时候释放内存,我知道是每个循环周期,如何从代码中检查?

  3. 1234563对象在标头,那么你不再可以分配对象,因为两者都会保留对象,谁能告诉我为什么我仍然可以这样编码而不会导致任何内存泄漏?

【问题讨论】:

  • 重新标记:“内存”和“管理”到“内存管理”
  • 这确实是一个用这种格式无法很好回答的问题。您需要获得一本关于 Objective-C 编程的好书并学习它。 (或者干脆放弃内存管理并坚持使用 ARC。)

标签: iphone objective-c memory memory-management


【解决方案1】:
  1. [object release] 立即释放您的对象。发送释放消息后,您不应该再次使用该对象 - 除非您绝对知道您仍然对该对象有保留。如果您的保留是最后一个保留,则可以在调用释放期间释放内存。 自动释放会在“稍后”释放一个对象,系统不保证“稍后”的含义,除非它会在当前消息的范围之后。

  2. 见上文,从代码的角度来看,没有真正的 qay 可以保证在自动释放之后调用 dealloc 时。您应该假设它是在您发送自动释放消息的方法返回之后的某个时间。

  3. 您只需要平衡保留和释放。如果您有一对多(在您描述的情况下很可能),那就是泄漏。相反,如果你有不平衡,当你访问释放的内存时,你会产生一个更具破坏性的错误。

保留属性的正确顺序是:

  1. alloc init // retain == 1

  2. set the property // retain == 2 due to setProperty calling retain.

  3. release the object // retain == 1

保留计数为 1,没有内存泄漏。

【讨论】:

  • 我会修改你的#1,在“你不应该再次使用该对象”之后加上一个句点。释放对象后,您永远不应再次使用它。您可能“知道”您有另一个保留,但是当您可以轻松地将发布调用移动到其他地方时,这会使您的代码混乱。
  • 一般来说是这样,但我认为在许多情况下保持弱引用是可以接受的。如果没有这种能力,你(可以)最终得到两个相互保留的对象和一个泄漏。根据经验,您是对的。
  • ...或者如果您有两个保留并释放一个,但知道您还有另一个保留。
猜你喜欢
  • 2011-01-07
  • 2011-04-11
  • 1970-01-01
  • 2011-06-06
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多