簡體   English   中英

Objective-C ARC是否正確使用塊?

[英]Objective-C proper use of blocks with ARC?

我知道之前曾有人問過這個問題,但是沒有一個解決方案可以解決我的問題,所以我再問一次。 我試圖通過一個塊的回調來對自己調用一個方法。 我收到以下錯誤:

在此區塊中強烈捕獲“自我”可能會導致保留周期

- (void)viewDidLoad {
   [super viewDidLoad];

   self.webClient.completionHandler = ^{
      [self populateData];
   };
}

我嘗試做類似下面的代碼,但仍然收到相同的警告。 有什么解決方案?

__weak id myself = self;
[myself populateData];  

您的代碼應如下所示:

- (void)viewDidLoad {
   [super viewDidLoad];

   __weak id weakSelf = self;
   self.webClient.completionHandler = ^{
      [weakSelf populateData];
   };
}

UIAdam給出了正確的答案,但是值得理解為什么它是正確的。

首先,您為什么收到警告?

self對webClient有很強的參考。 webClient對completionHandler有很強的引用。 completeHandler對self有很強的引用。 因此,如果您程序中的所有其他引用都消失了,則在此循環中仍然有對每個項目的強引用,因此它們永遠都不會被釋放。

寫作嘗試

__weak id myself = self;
[myself populateData];  

當然行不通。 該塊仍然引用自身,因為它正在將其分配給自己。 所以這里沒什么區別。

UIAdam的寫作解決方案

__weak id weakSelf =自我; self.webClient.completionHandler = ^ {[weakSelf populateData]; };

表示weakSelf是弱引用,並且該塊僅包含對self的弱引用。 因此,如果所有其他關於自我的強引用都消失了,那么只剩下一個弱引用了。 弱引用不會使自我保持活力,因此自我會被釋放。

現在,如果發生這種情況,但是又有其他對webClient的強引用並且您的塊被調用了,該怎么辦? weakSelf是弱引用,當對象被釋放時,弱引用設置為nil。 因此,您必須准備好在調用塊時,weakSelf為零。 實際上寫得更好

id strongSelf = weakSelf;
[strongSelf populatedData];

在塊內部:strongSelf可能設置為nil,或者將其設置為self。 但是,由於它是一個很強的參考,它將一直保持為非零,直到該塊完成為止。 如果不是零開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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