iOS block中weakSelf和strongSelf的使用

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。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容