//聯(lián)系人:石虎QQ:1224614774昵稱:嗡嘛呢叭咪哄
一传睹、概念:
循環(huán)引用:指的是多個對象相互引用時,使得引用形成一個環(huán)形岸晦,導致外部無法真正是否掉這塊環(huán)形內存欧啤。其實有點類似死鎖。
其實循環(huán)引用就是說我們的強引用形成了閉環(huán)启上,還會有很多自己寫的代碼中會出現(xiàn)邢隧,平時還是要注意寫法。當然xcode的instruments也能幫助到大家排除一些這樣類似的內存問題冈在。
二倒慧、出現(xiàn)循環(huán)引用的情況
例子:A->B->C->....->X->B ? ->表示強引用,這樣的B的引用計數(shù)就是2,假如A被系統(tǒng)釋放了纫谅,理論上A會自動減小A所引用的資源炫贤,就是B,那么這時候B的引用計數(shù)就變成了1付秕,所有B無法被釋放兰珍,然而A已經被釋放了,所有B的內存部分就肯定無法再釋放再重新利用這部分內存空間了询吴,導致內存泄漏掠河。
1.NSTimer
創(chuàng)建使用NSTimer的時候,NSTimer會默認對當前self有個強引用猛计,所有在self使用完成打算是否的時候唠摹,一定要先使用NSTimer的invalidate來停止是否時間控制對self的引用
[_timer?invalidate];
2.Block
Block也是比較常見的循環(huán)引用問題,在Block中使用了self容易出現(xiàn)循環(huán)引用奉瘤,因此很多人在使用block的時候跃闹,加入里面有用到self的操作都會聲明一個__weak來修飾self。其實便不是這樣的毛好,不是所有使用了Block都會出現(xiàn)Self循環(huán)引用問題望艺,只有self擁有Block的強引用才會出現(xiàn)這種情況。
所以一般在函數(shù)中臨時使用Block是不會出現(xiàn)循環(huán)應用的肌访,因為這時候Block引用是屬于棧的找默。當棧上的block釋放后,block中對self的引用計數(shù)也會減掉
當然不一定要Self對Block有直接的引用才會出現(xiàn)吼驶,假如self的變量B惩激,B中有個Block變量,就容易出現(xiàn)這種情況蟹演,好的是在block出現(xiàn)循環(huán)引用的风钻,xcode7會出現(xiàn)警告提示(之前版本不確定)。
3.delegate
Delegate是ios中開發(fā)中最常遇到的循環(huán)引用酒请,一般在聲明delegate的時候都要使用弱引用weak或者assign
@property(nonatomic,?weak,nullable)id?delegate;
當然怎么選擇使用assign還是weak骡技,MRC的話只能用assign,在ARC的情況下最好使用weak羞反,因為weak修飾的變量在是否后自動為指向nil布朦,防止不安全的野指針存在