簡體   English   中英

__weak self可以在塊的中間變成零嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM