国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 乐至县| 阜新市| 东至县| 兴隆县| 兰溪市| 保定市| 塘沽区| 杭州市| 尼玛县| 竹山县| 饶阳县| 广元市| 丰台区| 青浦区| 鄢陵县| 昂仁县| 冀州市| 闻喜县| 揭东县| 句容市| 华阴市| 洮南市| 大厂| 平乡县| 色达县| 晋江市| 元江| 江源县| 鸡东县| 郁南县| 修文县| 嘉义市| 梨树县| 克东县| 调兵山市| 宁津县| 武陟县| 广河县| 明溪县| 沾益县| 井陉县|