目標(biāo):block執(zhí)行過(guò)程中,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ì)有這樣的問(wèn)題。一般使用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]過(guò)程中,self是不會(huì)釋放的,完美。
但是,如果是這樣呢?
__weak __typeof(self) weakSelf = self;self.myBlock = ^() { [weakSelf doSomething]; [weakSelf doSomething2];};
在[weakSelf doSomething]和[weakSelf doSomething2]之間,self可能會(huì)被釋放掉。這可能會(huì)導(dǎo)致奇怪的問(wèn)題。
加入strong self
__weak __typeof(self) weakSelf = self;self.myBlock = ^() { __strong __typeof(self) strongSelf = weakSelf; [strongSelf doSomething]; [strongSelf doSomething2];};
這樣,block既沒(méi)有持有self,又能保證block在執(zhí)行過(guò)程中self不被釋放,真正達(dá)到了最初的目標(biāo)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)武林網(wǎng)的支持。
|
新聞熱點(diǎn)
疑難解答
圖片精選