保留周期关注
Retain cycle concern
我接了别的公司的项目,给变量赋值的时候经常看到这一段代码:
// interface:
@property NSArray *foos;
// somewhere in implementation:
BOOL foosExist = ^BOOL {
return self.foos.count > 0; // self inside block
}();
此外,编译器在通过基础变量 _foos
:
引用内部块到 foos
属性 时声明
Block implicitly retains "self"; explicitly mention "self" to indicate this is intended behavior.
块内的这个 self 是否真的创建了保留循环?如果不是,为什么?有人可以详细说明吗?
你的例子中没有循环。
您的块只是在计算表达式期间创建的值,它们会立即应用以产生 BOOL
值。
虽然您的情况不寻常,创建一个块以立即将其应用于同一表达式,但当您将块直接或通过将其存储在局部变量中并传递变量将块传递给另一个方法时,会发生类似的情况值 - 没有创建循环。
如果您创建了相同的块,但将其存储到 实例 变量(不是 局部变量),那么 self
将引用该块,该块将引用 self
,并且您将有一个循环。这本身并不坏,只有在循环永不中断的情况下才会变得糟糕,这会导致泄漏。但是,如果在某个时候循环被打破,比如将不同的值写入实例变量,那么循环永远不会成为问题。
HTH
我接了别的公司的项目,给变量赋值的时候经常看到这一段代码:
// interface:
@property NSArray *foos;
// somewhere in implementation:
BOOL foosExist = ^BOOL {
return self.foos.count > 0; // self inside block
}();
此外,编译器在通过基础变量 _foos
:
foos
属性 时声明
Block implicitly retains "self"; explicitly mention "self" to indicate this is intended behavior.
块内的这个 self 是否真的创建了保留循环?如果不是,为什么?有人可以详细说明吗?
你的例子中没有循环。
您的块只是在计算表达式期间创建的值,它们会立即应用以产生 BOOL
值。
虽然您的情况不寻常,创建一个块以立即将其应用于同一表达式,但当您将块直接或通过将其存储在局部变量中并传递变量将块传递给另一个方法时,会发生类似的情况值 - 没有创建循环。
如果您创建了相同的块,但将其存储到 实例 变量(不是 局部变量),那么 self
将引用该块,该块将引用 self
,并且您将有一个循环。这本身并不坏,只有在循环永不中断的情况下才会变得糟糕,这会导致泄漏。但是,如果在某个时候循环被打破,比如将不同的值写入实例变量,那么循环永远不会成为问题。
HTH