2017-05-05 116 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