IOS 常見(jiàn)的循環(huán)引用總結(jié)
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的話(huà)只能用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ì)本站的支持!
相關(guān)文章
iOS 鍵盤(pán)輸入限制(只能輸入字母,數(shù)字,禁止輸入特殊符號(hào))
本文主要介紹了iOS中鍵盤(pán)輸入限制(只能輸入字母,數(shù)字,禁止輸入特殊符號(hào))的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
IOS使用progssview仿滴滴打車(chē)圓形計(jì)時(shí)
本文給大家分享的是IOS中實(shí)現(xiàn)仿滴滴打車(chē)的原型計(jì)時(shí)效果,非常的實(shí)用,有需要的小伙伴可以參考下。2015-07-07
iOS密碼在進(jìn)入后臺(tái)1小時(shí)后重新設(shè)置
這篇文章主要介紹了iOS密碼在進(jìn)入后臺(tái)1小時(shí)后重新設(shè)置的相關(guān)資料,需要的朋友可以參考下2017-08-08
iOS開(kāi)發(fā)一個(gè)好看的ActionSheet
本篇文章通過(guò)代碼分享和圖文形式教給大家用IOS寫(xiě)一個(gè)好看的ActionSheet過(guò)程以及注意事項(xiàng),需要的朋友參考下吧。2018-01-01
Xcode 下刪除Provisioning Profiles文件詳細(xì)介紹
這篇文章主要介紹了Xcode 下刪除Provisioning Profiles文件詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-12-12
iOS給圖片添加濾鏡&使用openGLES動(dòng)態(tài)渲染圖片詳解及實(shí)例
這篇文章主要介紹了iOS給圖片添加濾鏡&使用openGLES動(dòng)態(tài)渲染圖片詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-10-10
深入講解iOS開(kāi)發(fā)中應(yīng)用數(shù)據(jù)的存儲(chǔ)方式
這篇文章主要介紹了iOS開(kāi)發(fā)中應(yīng)用數(shù)據(jù)的存儲(chǔ)方式,包括plistXML屬性列表和NSKeydeArchiver歸檔兩個(gè)部分,需要的朋友可以參考下2015-12-12
iOS實(shí)現(xiàn)滑動(dòng)弧形菜單的思路與方法
這篇文章主要給大家介紹了利用iOS實(shí)現(xiàn)滑動(dòng)弧形菜單的思路與方法,實(shí)現(xiàn)后的效果非常不錯(cuò),非常適合大家在開(kāi)發(fā)中使用,文末給出了封裝源碼下載的地址供大家下載學(xué)習(xí),需要的朋友可以參考,下面來(lái)一起看看吧。2017-05-05

