相信網路請求大家都會封裝起來,有的封裝成單例,有的封裝成靜態方法。
[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 會更安全一些。