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

首頁 > 系統 > iOS > 正文

IOS 常見的循環引用總結

2019-10-21 18:47:43
字體:
來源:轉載
供稿:網友

IOS 常見的循環引用總結

介紹:

循環引用,指的是多個對象相互引用時,使得引用形成一個環形,導致外部無法真正是否掉這塊環形內存。其實有點類似死鎖。

舉個例子:A->B->C->....->X->B   ->表示強引用,這樣的B的引用計數就是2,假如A被系統釋放了,理論上A會自動減小A所引用的資源,就是B,那么這時候B的引用計數就變成了1,所有B無法被釋放,然而A已經被釋放了,所有B的內存部分就肯定無法再釋放再重新利用這部分內存空間了,導致內存泄漏。

情況一:delegate

Delegate是ios中開發中最常遇到的循環引用,一般在聲明delegate的時候都要使用弱引用weak或者assign

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

當然怎么選擇使用assign還是weak,MRC的話只能用assign,在ARC的情況下最好使用weak,因為weak修飾的變量在是否后自動為指向nil,防止不安全的野指針存在

情況二:Block

Block也是比較常見的循環引用問題,在Block中使用了self容易出現循環引用,因此很多人在使用block的時候,加入里面有用到self的操作都會聲明一個__weak來修飾self。其實便不是這樣的,不是所有使用了Block都會出現Self循環引用問題,只有self擁有Block的強引用才會出現這種情況。

所以一般在函數中臨時使用Block是不會出現循環應用的,因為這時候Block引用是屬于棧的。當棧上的block釋放后,block中對self的引用計數也會減掉

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

情況三:NSTimer

這是一個神奇的NSTimer,當你創建使用NSTimer的時候,NSTimer會默認對當前self有個強引用,所有在self使用完成打算是否的時候,一定要先使用NSTimer的invalidate來停止是否時間控制對self的引用

[_timer invalidate];

總結:

上面說的是我們常見的,其實循環引用就是說我們的強引用形成了閉環,還會有很多自己寫的代碼中會出現,平時還是要注意寫法。當然xcode的instruments也能幫助到大家排除一些這樣類似的內存問題。

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


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 温泉县| 惠州市| 格尔木市| 庆云县| 钦州市| 兴国县| 垣曲县| 福鼎市| 常熟市| 开平市| 芦溪县| 吉水县| 来安县| 固始县| 平遥县| 顺义区| 库尔勒市| 泗阳县| 万荣县| 常山县| 申扎县| 友谊县| 航空| 东乌珠穆沁旗| 舟山市| 定南县| 漠河县| 五华县| 安岳县| 昌都县| 万荣县| 元阳县| 华阴市| 绥德县| 岳西县| 梓潼县| 东乡族自治县| 青神县| 德兴市| 杨浦区| 凤阳县|