Apple 官方的建議是,傳進 Block 之前,把 ‘self’ 轉換成 weak automatic 的變量,這樣在 Block 中就不會出現(xiàn)對 self 的強引用。如果在 Block 執(zhí)行完成之前,self 被釋放了,weakSelf 也會變?yōu)?nil。
示例代碼:
__weak __typeof(self)weakSelf = self dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[weakSelf doSomething];
});
clang 的文檔表示,在 doSomething 內(nèi),weakSelf 不會被釋放。但,下面的情況除外:
__weak __typeof(self)weakSelf = self
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[weakSelf doSomething];
[weakSelf doOtherThing];
});
在 doSomething 中,weakSelf 不會變成 nil,不過在 doSomething 執(zhí)行完成,調(diào)用第二個方法 doOtherThing 的時候,weakSelf 有可能被釋放,于是,strongSelf 就派上用場了:
__weak __typeof(self)weakSelf = self
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
__strong __typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doOtherThing];
});
__strong 確保在 Block 內(nèi),strongSelf 不會被釋放。
總結
1 在 Block 內(nèi)如果需要訪問 self 的方法、變量,建議使用 weakSelf。
2 如果在 Block 內(nèi)需要多次 訪問 self,則需要使用 strongSelf。