[英]Can __weak self turn nil in the middle of the block?
當在后台線程上運行的塊中使用__weak
self
引用時,我是否僅需要在開始時檢查nil
,或者即使在第一個nil
測試通過后執行期間__weak
self
也可以變為nil? 我想從代碼塊中的self
訪問一些ivars,並且在代碼塊執行時需要最新的值。
如果沒有人提到self
那就是。 您可以通過在代碼塊中充分引用來減輕這種情況
__weak __typeof(self) weakSelf = self;
^{
__strong __typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
};
通過從塊內部強烈引用,可以避免將引用設置為nil。
強烈引用塊內的弱指針。
__weak MyObject *weakSelf = self; // a weak reference
myBlock = ^{
MyObject *innerSelf = weakSelf; // a block-local strong reference
NSLog(@"MyObject: %@", innerSelf);
};
避免直接使用變量,因為這會導致保留周期。 如果直接在塊內使用實例變量,則該塊將捕獲self,因此您必須使用其訪問器來引用實例變量。
__weak MyObject *weakSelf = self;
myBlock = ^{
MyObject *innerSelf = weakSelf; // a block-local strong reference
NSLog(@"MyObject: %@", innerSelf);
NSLog(@"MyObject ID: %d", innerSelf.objectID);
};
如果您像這樣直接使用實例變量:
NSLog(@"MyObject ID: %d", _objectID);
編譯器將_objectID
解釋為self->_objectID
,其中self被您的塊捕獲。
弱引用的本質是,當在另一個線程中刪除最后一個強引用時,它隨時可能變為零。 如果您訪問成員變量,這將是致命的,因為這將導致崩潰;而如果對該弱變量調用方法,則將是致命的,因為self是不安全的,無法保留。
每個人都可以使用一種簡單的方法來解決此問題:在執行任何操作之前,不做任何檢查就將弱變量存儲到字符串中。 然后檢查強變量是否為nil; 那檢查需要一次 。
在Xcode中打開所有警告,因此,如果您做任何危險的事情,都會收到警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.