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

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

IOS 常見(jiàn)的循環(huán)引用總結(jié)

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

IOS 常見(jiàn)的循環(huán)引用總結(jié)

介紹:

循環(huán)引用,指的是多個(gè)對(duì)象相互引用時(shí),使得引用形成一個(gè)環(huán)形,導(dǎo)致外部無(wú)法真正是否掉這塊環(huán)形內(nèi)存。其實(shí)有點(diǎn)類(lèi)似死鎖。

舉個(gè)例子:A->B->C->....->X->B   ->表示強(qiáng)引用,這樣的B的引用計(jì)數(shù)就是2,假如A被系統(tǒng)釋放了,理論上A會(huì)自動(dòng)減小A所引用的資源,就是B,那么這時(shí)候B的引用計(jì)數(shù)就變成了1,所有B無(wú)法被釋放,然而A已經(jīng)被釋放了,所有B的內(nèi)存部分就肯定無(wú)法再釋放再重新利用這部分內(nèi)存空間了,導(dǎo)致內(nèi)存泄漏。

情況一:delegate

Delegate是ios中開(kāi)發(fā)中最常遇到的循環(huán)引用,一般在聲明delegate的時(shí)候都要使用弱引用weak或者assign

@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;

當(dāng)然怎么選擇使用assign還是weak,MRC的話只能用assign,在ARC的情況下最好使用weak,因?yàn)閣eak修飾的變量在是否后自動(dòng)為指向nil,防止不安全的野指針存在

情況二:Block

Block也是比較常見(jiàn)的循環(huán)引用問(wèn)題,在Block中使用了self容易出現(xiàn)循環(huán)引用,因此很多人在使用block的時(shí)候,加入里面有用到self的操作都會(huì)聲明一個(gè)__weak來(lái)修飾self。其實(shí)便不是這樣的,不是所有使用了Block都會(huì)出現(xiàn)Self循環(huán)引用問(wèn)題,只有self擁有Block的強(qiáng)引用才會(huì)出現(xiàn)這種情況。

所以一般在函數(shù)中臨時(shí)使用Block是不會(huì)出現(xiàn)循環(huán)應(yīng)用的,因?yàn)檫@時(shí)候Block引用是屬于棧的。當(dāng)棧上的block釋放后,block中對(duì)self的引用計(jì)數(shù)也會(huì)減掉

當(dāng)然不一定要Self對(duì)Block有直接的引用才會(huì)出現(xiàn),假如self的變量B,B中有個(gè)Block變量,就容易出現(xiàn)這種情況,好的是在block出現(xiàn)循環(huán)引用的,xcode7會(huì)出現(xiàn)警告提示(之前版本不確定)。

情況三:NSTimer

這是一個(gè)神奇的NSTimer,當(dāng)你創(chuàng)建使用NSTimer的時(shí)候,NSTimer會(huì)默認(rèn)對(duì)當(dāng)前self有個(gè)強(qiáng)引用,所有在self使用完成打算是否的時(shí)候,一定要先使用NSTimer的invalidate來(lái)停止是否時(shí)間控制對(duì)self的引用

[_timer invalidate];

總結(jié):

上面說(shuō)的是我們常見(jiàn)的,其實(shí)循環(huán)引用就是說(shuō)我們的強(qiáng)引用形成了閉環(huán),還會(huì)有很多自己寫(xiě)的代碼中會(huì)出現(xiàn),平時(shí)還是要注意寫(xiě)法。當(dāng)然xcode的instruments也能幫助到大家排除一些這樣類(lèi)似的內(nèi)存問(wèn)題。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 红河县| 望城县| 井研县| 来凤县| 公主岭市| 喜德县| 饶平县| 婺源县| 五峰| 拜泉县| 邢台市| 平武县| 甘肃省| 准格尔旗| 临桂县| 双峰县| 墨江| 平度市| 潞西市| 泾川县| 定兴县| 宜宾县| 沂源县| 湖口县| 洛阳市| 博客| 怀安县| 大关县| 河池市| 南城县| 山丹县| 古田县| 怀来县| 大同县| 城固县| 永善县| 纳雍县| 新津县| 甘孜县| 许昌县| 鄂伦春自治旗|