中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

IOS 常見的循環引用總結

發布時間:2020-08-23 11:17:16 來源:腳本之家 閱讀:453 作者:余成海 欄目:移動開發

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也能幫助到大家排除一些這樣類似的內存問題。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

左权县| 普安县| 墨玉县| 新宁县| 南乐县| 祁东县| 黑水县| 囊谦县| 龙胜| 吴旗县| 罗江县| 利津县| 绥化市| 中卫市| 菏泽市| 姜堰市| 江川县| 襄垣县| 新密市| 彭山县| 房山区| 达州市| 白城市| 永川市| 丹巴县| 云浮市| 都江堰市| 泉州市| 墨脱县| 武功县| 双牌县| 名山县| 叙永县| 西畴县| 修水县| 鸡西市| 榆中县| 巴中市| 阿鲁科尔沁旗| 镇安县| 平阳县|