【问题标题】:iOS: Simple Retain CycleiOS:简单的保留周期
【发布时间】:2013-11-09 06:07:42
【问题描述】:

假设你有一个 viewController:

@property (strong) object* A 
@property (strong) object* B

然后你故意在某个时候创建​​一个保留周期,没有计时器,这样

self.A.someStrongProperty = self  //retain cycle

问题:假设包含这些属性的 VC 被释放,保留周期或内存泄漏是否会持续存在?

【问题讨论】:

  • ...这是一个简单的赋值,没有保留循环。
  • 抱歉让我改述一下

标签: ios objective-c cocoa-touch memory-management retain-cycle


【解决方案1】:

是的,如果您保留 self,则会导致保留周期。

这将导致self 实例未被释放,从而导致内存泄漏。

为防止这种情况,您可以使用weak 属性或在某个时候手动将someStrongProperty 设置为nil,以中断保留周期。

【讨论】:

  • -setA: 将在分配_A = B 时强烈保留B,这不是问题。
  • 首先,这是 ARC,_A = B 确实保留了 B。其次,A是指向对象*A的指针,B是指向对象*B的指针。所有self.A = self.B 所做的只是释放*A 并保留*B。
  • 我指的是_A = B时的setter实现。将会发生类似[_A release]; _A = [self.B retain]; 的情况,这将导致B 被发送retain 消息。
  • 所以是的,我们在说同样的事情。 A 将强烈引用 *B,但显然没有创建循环。
  • 是的,A 成为对 B 的强引用。我以为您是说最初位于 A 的对象在该分配期间保留了 B 的对象。很高兴我们解决了这个问题。
【解决方案2】:

在您上面发布的代码中,没有保留周期。

保留周期将是 self.A = self; 或更可能是 self.A.someStrongProperty = self。

编辑:如果您在上面进行了编辑,假设self 是一个视图控制器,由于保留周期,它不会被释放。您应该将 someStrongProperty 更改为 weak 属性,这将阻止保留周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2018-05-13
    • 2012-07-01
    • 2012-09-29
    相关资源
    最近更新 更多