在使用 block 的時候聋丝,為了避免產生循環(huán)引用,通常需要使用 weakSelf 與 strongSelf缀辩,代碼如下:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
__weak __typeof__(self) weakSelf = self;
dispatch_async(queue, ^{
__typeof__(self) strongSelf = weakSelf;
[strongSelf assitFunc1];
});
問題一: 系統(tǒng)block為何 self 不用弱引用 如下:
[UIView animateWithDuration:duration animations:^{
[self.superview layoutIfNeeded];
}];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.someProperty = xyz;
}];
[[NSNotificationCenter defaultCenter] addObserverForName:@"someNotification"
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * notification) {
self.someProperty = xyz;
}];
這些系統(tǒng)的 block 不會造成循環(huán)引用的原因是臭埋,這是個類方法踪央,block 不被 self 持有 ,而是其他負責的對象持有,同時不產生循環(huán)引用,block 持有了 self, block 運行結束會被釋放,同時釋放掉對 self 的持有, 所以不存在self 和 block 的循環(huán)引用問題,不需要weak 弱引用
問題二:什么時候在 block 里面可以用 self,不需要使用 weak self
之所以需要弱引用本身瓢阴,是因為怕對象之間產生循環(huán)引用畅蹂,引起程序崩潰,內存泄漏!
所謂“引用循環(huán)”是指雙向的強引用荣恐,所以那些“單向的強引用”(block 強引用 self )沒有問題
問題三:為什么 block 里面還需要寫一個 strong self液斜,如果不寫會怎么樣?
在 block 中先寫一個 strong self叠穆,其實是為了避免在 block 的執(zhí)行過程中少漆,突然出現(xiàn) self 被釋放的尷尬情況,那么多半情況下會 Crash.
總結:
1.block 不形成循環(huán)引用硼被,并且想讓block代碼什么情況下都執(zhí)行:兩種方式:A全部使用self就行示损;B外面定義weak,block里面用strong嚷硫,也行检访,多此一舉。
2.block 不形成循環(huán)引用仔掸,并且想讓block代碼在當前VC釋放的情況下不執(zhí)行:兩種方式:A外面定義weak脆贵,里面使用weak,然后注意nil可能會crash的地方(加判斷)起暮;B外面定義weak丹禀,block里面使用strong(或者直接使用self),自己加if判斷鞋怀,否是在當前頁面,不在當前頁面不執(zhí)行持搜。
3.block 循環(huán)引用密似,想讓block代碼無論如何都執(zhí)行:必用weak。block里面用strong葫盼。
4.block 循環(huán)引用残腌,想讓block代碼在當前VC釋放的情況下不執(zhí)行:兩種方式:A必用weak,block里面用strong贫导,則自己加if判斷不在當前頁面就不執(zhí)行抛猫;B,block里面使用weak孩灯,注意nil可能導致crash的地方闺金。