我們知道,在使用 block 的時候污尉,為了避免產(chǎn)生循環(huán)引用膀哲,通常需要使用 weakSelf 與 strongSelf,寫下面這樣的代碼:
__weak typeof(self) weakSelf = self;
[self doSomeBackgroundJob:^{
? __strong typeof(weakSelf) strongSelf = weakSelf;
? ? ?if (strongSelf) {
? ? ? ? ? ?//…
? }}];
那么請問:為什么 block 里面還需要寫一個 strong self被碗,如果不寫會怎么樣某宪?
在 block 中先寫一個 strong self,其實是為了避免在 block 的執(zhí)行過程中锐朴,突然出現(xiàn) self 被釋放的尷尬情況兴喂。通常情況下,如果不這么做的話包颁,還是很容易出現(xiàn)一些奇怪的邏輯瞻想,甚至閃退。
我們以 AFNetworking 中 AFNetworkReachabilityManager.m 的一段代碼舉例:
__weak __typeof(self)weakSelf = self;
AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {
? __strong __typeof(weakSelf)strongSelf = weakSelf;
strongSelf.networkReachabilityStatus = status;
if (strongSelf.networkReachabilityStatusBlock) {
? ? ? ? ? strongSelf.networkReachabilityStatusBlock(status);
}
};
如果沒有 strongSelf 的那行代碼娩嚼,那么后面的每一行代碼執(zhí)行時蘑险,self 都可能被釋放掉了,這樣很可能造成邏輯異常岳悟。
特別是當(dāng)我們正在執(zhí)行 strongSelf.networkReachabilityStatusBlock(status); 這個 block 閉包時佃迄,如果這個 block 執(zhí)行到一半時 self 釋放,那么多半情況下會 Crash贵少。
我再項目中是這樣寫的,暫時還沒遇到什么問題呵俏。