UIAdam給出了正確的答案,但它是值得理解爲什麼它是正確的。
首先,你爲什麼得到警告?
自我對webClient有很強的參考價值。 webClient對completionHandler有很強的參考價值。 completionHandler對自我很有借鑑意義。因此,如果程序中的所有其他引用都消失了,這個循環中的每個項目仍然有很強的參考,所以它們永遠不會被釋放。
寫
__weak id myself = self;
[myself populateData];
當然不工作的嘗試。該塊仍然引用自我,因爲它將它分配給我自己。所以這裏沒有區別。
寫
__weak ID weakSelf =自我UIAdam的解決方案; self.webClient.completionHandler =^{weakSelf populateData]; };
意味着weakSelf是一個弱引用,並且該塊只包含對自我的弱引用。所以如果所有其他對自我的強烈引用都消失了,那麼只剩下一個弱引用。弱引用不會讓自己活着,所以自我被釋放。
現在如果發生這種情況,但是其他的東西對webClient有強烈的參考,並且您的塊被調用? weakSelf是一個弱引用,當對象被釋放時弱引用被設置爲零。所以你必須做好準備,當你的街區被叫時,weakSelf是零的。它實際上更好寫
id strongSelf = weakSelf;
[strongSelf populatedData];
塊內:strongSelf可能被設置爲零,或者它會被設置爲自我。但由於它是一個強有力的參考,它將保持非零,直到塊完成。如果不是零開始。
你是否在塊內放置__weak行?如果是這樣,它需要在設置完成處理程序/定義塊的行之前。 – UIAdam
yes right before [self populateData] – aryaxt
有沒有一種更清潔的方法能夠做到塊內的一切? – aryaxt