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

