循環(huán)引用
在平時開發(fā)過程中,block是我們經(jīng)常使用的功能压彭,如果不多加注意就會造成一些問題,首先一個小案例看一下循環(huán)引用出現(xiàn)情況
self.myBlock = ^(){
[self foo];
};
以上造成循環(huán)引用的原因是self持有了block佃扼,而block內(nèi)部也持有了self升略,導(dǎo)致循環(huán)引用
self -> block -> self
用圖來解釋的話
self和block相互持有
當(dāng)作用域結(jié)束后微王,block依然持有self
解決方案如下
__weak typeof(self) weakSelf = self;
self.myBlock = ^(){
[weakSelf foo];
};
block持有weak屬性的self
作用域結(jié)束后,一同釋放
保證了當(dāng)self對block的持有結(jié)束之后品嚣,block可以釋放掉self
__strong
__weak typeof(self) weakSelf = self;
self.myBlock = ^(){
__strong typeof(weakSelf) = strongSelf;
[strongSelf doSomething];
};
防止內(nèi)部weakself在某些情況下被釋放掉炕倘,使用__strong修飾一次可解決這個問題。
不會造成循環(huán)引用的情況
并不是所有的block都會造成循環(huán)引用翰撑,只有被self所持有的block才會造成這種問題罩旋,下面例舉兩個例子
dispatch_async(dispatch_get_main_queue, ^{
[self doSomething];
});
這里的gcd并沒有被self所持有,所以不會造成循環(huán)引用
- (void)testWithBlock:(void(^)())block {
block();
}
[self testWithBlock:^{
[self test];
}];
同理眶诈,局部變量block也沒有被self所持有涨醋,所以不會造成問題