国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

Objective-C中block循環(huán)引用問(wèn)題詳解

2020-07-26 02:19:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

目標(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)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 万年县| 白水县| 蕲春县| 亚东县| 永平县| 射阳县| 威海市| 大荔县| 石首市| 油尖旺区| 芒康县| 盱眙县| 衡南县| 太和县| 叶城县| 淳安县| 防城港市| 奉化市| 峨山| 西贡区| 陆川县| 财经| 随州市| 扎兰屯市| 青河县| 安徽省| 南部县| 合山市| 抚宁县| 黔江区| 莒南县| 柳江县| 宜城市| 渑池县| 平江县| 扬州市| 博客| 涡阳县| 天长市| 军事| 藁城市|