這里記錄兩個問題:
1就珠、界面退出了寇壳,網(wǎng)絡(luò)請求還結(jié)束,那么網(wǎng)絡(luò)請求會被取消嗎妻怎?
首先給出答案壳炎,網(wǎng)絡(luò)請求不會取消,網(wǎng)絡(luò)請求會執(zhí)行完畢,進(jìn)入回調(diào)的block里面匿辩,然后執(zhí)行完block里面的代碼之后腰耙,這時控制器才會銷毀,才會調(diào)用控制器的delloc方法铲球。
2挺庞、網(wǎng)絡(luò)請求回調(diào)里面是使用self還是weakself?
首先聲明一點(diǎn),這里無論是用 weakSelf 還是 self 稼病,都不會引起 retain cycle 选侨,所以并不是為了解決循環(huán)引用,才用 weakSelf然走。
下面說重點(diǎn)
舉個栗子援制,從 A push 到 B ,B中有個網(wǎng)絡(luò)請求芍瑞,在網(wǎng)絡(luò)請求結(jié)束之前晨仑,pop 回 A 了。假如過了1秒啄巧,網(wǎng)絡(luò)請求收到 response 寻歧。注意,收到response之后秩仆,block是一定會執(zhí)行的
此時分為兩種情況:
weakSelf:B 立即被釋放码泛,收到 response 之后,block 會執(zhí)行澄耍。
self:B 沒有被立即釋放噪珊,收到 response 之后,block 會執(zhí)行齐莲,執(zhí)行完之后痢站,B 被釋放。
在之前的文章說了选酗,block 會對其里面的變量進(jìn)行強(qiáng)引用阵难。所以用 self 的時候,由于 block 持有self芒填,所以造成了延遲釋放呜叫。
說一個很極端的情況,還是上面的情景殿衰,但是需要在 B 的網(wǎng)絡(luò)請求完成之后朱庆,回調(diào)給 A 。
那么此時就必須用 self闷祥,必須讓 B 延遲釋放娱颊。如果使用了weakSelf,那么 B 已經(jīng)被釋放了,weakSelf就是空箱硕,所以 A 就收不到回調(diào)拴竹。
所以,到底是用 weakSelf 還是用 self 剧罩,一般情況下殖熟,用 self 會更安全一些。