【问题标题】:Can any one explain Retain cycle with example code(Objective C) ? and How can we remove retain Cycle ?(with code)任何人都可以用示例代码(目标 C)解释保留循环吗?以及我们如何删除保留循环?(带代码)
【发布时间】:2010-09-03 09:20:31
【问题描述】:

任何人都可以用示例代码(目标 C)解释保留循环吗?以及我们如何删除保留周期?(带有代码或图表)。我理论上知道,但我从来没有遇到过这种程序?我很好奇,如何解决保留循环(使用代码或图表)?

【问题讨论】:

  • 你在做作业吗?这是第三个类似的问题。
  • 不,我没有做任何功课。我一直在阅读 Objective C 编程指南,我心中有一些疑问,我只是想清除它。
  • 我已经阅读了所有理论,例如保留循环,所以我只是认为实际上是否也有可能......更频繁。我只是想我应该问一下过去遇到过保留周期情况的其他人。

标签: iphone


【解决方案1】:

委托是一个示例,您必须通过在委托属性上使用assign 属性来避免保留周期。例如,您有一个创建子对象的父对象:

self.child = [[[Child alloc] init] autorelease];

所以父级保留了对子级的引用(因为属性设置器保留了它)。

现在父级将自己设置为子级的委托:

self.child.delegate = self;

现在,如果子级保留其delegate 属性,则存在一个保留循环。两者都包含对另一个的引用并且不能被释放。

为避免这种情况,孩子使用assign 属性声明委托属性:

@property (nonatomic, assign) id delegate;

这是安全的,因为委托人几乎总是比委托人长寿。如果没有,父母应该在孩子的委托消失之前将其设置为 nil。

【讨论】:

    【解决方案2】:

    Objective-C 的内存管理方面在很多地方都有很好的介绍。

    一些参考资料:

    1. http://www.otierney.net/objective-c.html#memorymanagement
    2. http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

    如果您有不确定的具体解决方案,您可以考虑回到这里,以便我们有具体的例子来评论。您发布您的代码,如果您担心它可能看起来很愚蠢或充满错误,请不要犹豫。这是最好的学习方式。

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 2013-05-04
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多