我們知道荤堪,在使用 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,其實(shí)是為了避免在 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芽卿。