2017-05-05 69 views
0

我从另一家公司接手的项目和分配值时可变我经常看到的这部分代码:保留周期关注

// interface: 
@property NSArray *foos; 


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

而且通过基础变量_foos内块引用到foos属性时,编译器要求:

块隐含地保留“自我”;明确提及“自我”以表明这是预期的行为。

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

+0

为什么创建一个块只能立即运行呢? – newacct

+0

@newacct我相信它的设计是为了提高可读性并降低对象的可变性(在块的范围之外)。块大多包含比5更多的LoC。 – Neru

回答

4

你的例子中没有循环。

您的块只是在评估表达式时创建的值,它们立即应用于生成值BOOL

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

相反,如果你创建了同一块,但它存储到实例变量(一个局部变量),然后self将引用块,块将引用self,你将有一个周期。这本身并不坏,只是如果循环从未被破坏,这会导致泄漏,这只会变得很糟糕。但是,如果在某个时间点周期被破坏,比如通过向实例变量写入一个不同的值,那么周期永远不会成为问题。

HTH