【问题标题】:Retain cycle concern保留周期关注
【发布时间】:2017-05-05 09:32:07
【问题描述】:

我接手了另一家公司的项目,在给变量赋值时经常看到这部分代码:

// interface:
@property NSArray *foos;


// somewhere in implementation:
BOOL foosExist = ^BOOL {
    return self.foos.count > 0; // self inside block
}();

此外,当底层变量 _foos 引用内部块到 foos 属性时,编译器声明:

Block 隐式保留“self”;明确提及“self”以表明这是预期行为。

块内的这个 self 真的会创建保留循环吗?如果不是,为什么?有人可以详细说明吗?

【问题讨论】:

  • 为什么创建一个块只是为了立即运行它?
  • @newacct 我相信它的设计是为了提高可读性并减少对象的可变性(块范围之外)。 Blocks 中的 LoC 多于 5 个。

标签: ios objective-c memory-leaks retain-cycle


【解决方案1】:

您的示例中没有循环。

您的块只是在评估表达式期间创建的一个值,它们会立即应用于生成BOOL 值。

虽然您的情况不寻常,但创建一个块以立即将其应用到同一个表达式中,当您将一个块直接或通过将其存储在局部变量中并传递变量值传递给另一个方法时,也会发生类似的情况 -没有创建循环。

如果您创建了相同的块,但将其存储到 instance 变量中(不是局部变量),那么 self 将引用该块,该块将参考self,你就会有一个循环。这本身并不坏,只有在循环从未中断时才会变得糟糕,这会导致泄漏。但是,如果在某个时候循环被打破,例如通过将不同的值写入实例变量,那么循环永远不会成为问题。

HTH

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多