Objective-C中block循環(huán)引用問題詳解
目標:block執(zhí)行過程中,self不會釋放;執(zhí)行完可以釋放。
最初
block中直接使用self會強引用。
self.myBlock = ^() {
[self doSomething];
};
或者使用了對象的屬性
self.myBlock = ^() {
NSString *str = _str;
NSString *str2 = self.str;
};
在這樣的情況下,self強引用block,block也持有該對象,導致循環(huán)引用。
要注意的是,只有在self強引用block的時候才會有這樣的問題。一般使用GCD或NSOperation時使用的內(nèi)聯(lián)block是不會出現(xiàn)循環(huán)引用的。
加入weak self
__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
[weakSelf doSomething];
};
這樣,self持有了block,但block對self是弱引用,就不會導致循環(huán)引用了。
而在[weakSelf doSomething]過程中,self是不會釋放的,完美。
但是,如果是這樣呢?
__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
[weakSelf doSomething];
[weakSelf doSomething2];
};
在[weakSelf doSomething]和[weakSelf doSomething2]之間,self可能會被釋放掉。這可能會導致奇怪的問題。
加入strong self
__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
__strong __typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doSomething2];
};
這樣,block既沒有持有self,又能保證block在執(zhí)行過程中self不被釋放,真正達到了最初的目標。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
IOS開發(fā)中加載大量網(wǎng)絡圖片優(yōu)化方法
這篇文章主要介紹了IOS開發(fā)中加載大量網(wǎng)絡圖片如何優(yōu)化的相關資料,需要的朋友可以參考下2017-03-03
詳解iOS應用使用Storyboard布局時的IBOutlet與IBAction
這篇文章主要介紹了iOS應用使用Storyboard布局時的IBOutlet與IBAction,文中還附帶講解了為什么IBOutlet屬性是weak的,需要的朋友可以參考下2016-04-04
IOS簡單實現(xiàn)瀑布流UICollectionView
這篇文章主要為大家介紹了IOS簡單實現(xiàn)瀑布流UICollectionView的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-01-01
iOScollectionView廣告無限滾動實例(Swift實現(xiàn))
本篇文章主要介紹了iOScollectionView廣告無限滾動實例,可以實現(xiàn)廣告無限滾動,有興趣的可以了解一下。2016-11-11
Objective-C 代碼與Javascript 代碼相互調(diào)用實例
這篇文章主要介紹了Objective-C 代碼與Javascript 代碼相互調(diào)用實例的相關資料,現(xiàn)在的APP 應用有時候會調(diào)用網(wǎng)頁上的內(nèi)容,為了增加用戶體驗,這里寫下個實例,需要的朋友可以參考下2016-10-10

