網路請求回撥的Block中,到底是用weakSelf還是用self?

Se7en丶秦發表於2017-12-21

相信網路請求大家都會封裝起來,有的封裝成單例,有的封裝成靜態方法。

[JRNetworkTool POSTRequest:CircleGetOpenUserURL params:@{@"OpenId": userId, @"OpenUserCategory":@0} succeed:^(JRResponse *response) {
    //這裡處理你的response
    //那麼這裡需要用self的話,是weakSelf還是self呢?

} fail:^(NSInteger failCode, id otherInfo) {

}];
複製程式碼

首先宣告一點,這裡無論是用 weakSelf 還是 self ,都不會引起 retain cycle ,所以並不是為了解決迴圈引用,才用 weakSelf。

下面說重點

舉個栗子,從 A push 到 B ,B中有個網路請求,在網路請求結束之前,pop 回 A 了。假如過了1秒,網路請求收到 response 。注意,收到response之後,block是一定會執行的 此時分為兩種情況:

weakSelf:B 立即被釋放,收到 response 之後,block 會執行。
self:B 沒有被立即釋放,收到 response 之後,block 會執行,執行完之後,B 被釋放。

在之前的文章說了,block 會對其裡面的變數進行強引用。所以用 self 的時候,由於 block 持有self,所以造成了延遲釋放。

說一個很極端的情況,還是上面的情景,但是需要在 B 的網路請求完成之後,回撥給 A 。 那麼此時就必須用 self,必須讓 B 延遲釋放。如果使用了weakSelf,那麼 B 已經被釋放了,weakSelf就是空,所以 A 就收不到回撥。

所以,到底是用 weakSelf 還是用 self ,一般情況下,用 self 會更安全一些。

相關文章