本文具體介紹的爲在ARC狀況下容易引發內存泄漏的一些狀況,僅爲本人遇到的狀況下的小總結,但願能夠給你們提供一些幫助。html
1.循環參照app
A有個屬性參照B,B有個屬性參照A,若是都是strong參照的話,兩個對象都沒法釋放。atom
這種問題常發生於把delegate聲明爲strong屬性了。spa
例,指針
@interface SampleViewControllerhtm
@property (nonatomic, strong) SampleClass *sampleClass;對象
@endblog
@interface SampleClass內存
@property (nonatomic, strong) SampleViewController *delegate;rem
@end
上例中,解決辦法是把SampleClass 的delegate屬性的strong改成assign便可。也就是在聲明協議後,建立一個實例變量須要用assign
2.死循環
若是某個ViewController中有無限循環,也會致使即便ViewController對應的view關掉了,ViewController也不能被釋放。
這種問題常發生於animation處理。
例,
好比,
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
tansition.repeatCount = HUGE_VALL;
[self.view.layer addAnimation:transition forKey:"myAnimation"];
上例中,animation重複次數設成HUGE_VALL,一個很大的數值,基本上等於無限循環了。
解決辦法是,在ViewController關掉的時候,中止這個animation。
-(void)viewWillDisappear:(BOOL)animated {
[self.view.layer removeAllAnimations];
}
3.block的循環引用
在這裏我簡要的說一下循環引用是因爲在block內部引用了外部一些變量的自己,形成了一個循環鏈,從而致使循環引用,形成內存泄漏。
具體介紹請見以前博文 連接爲: http://www.cnblogs.com/MasterPeng/p/5311911.html
內存泄露的狀況固然不止以上三種。
即便用了ARC,咱們也要深入理解iOS的內存管理機制,這樣纔能有效避免內存泄露。
用arc和非arc混編,非arc的類在arc裏實例化而且使用,在arc裏竟然出現內存泄露,並且應爲是arc,因此沒法使用release,autorelease和dealloc去管理內存。正常狀況下應該是不會出現這種狀況的,某一個類如果ARC,則在這個類裏面都應該遵循ARC的用法,而無需關心用到的類是不是ARC的,一樣,在非ARC類裏面,就須要遵循內存管理原則。
用ARC,只是編譯器幫你管理了什麼時候去release,retain,不用ARC就須要你本身去管理,說到底只是誰去管理的問題,因此你再好好看看,可能問題與ARC無關。若是實在找不到問題,建議你找到泄露的那個對象,將其賦值爲nil,由於ARC裏面,一旦對象沒有指針指向,就會立刻被釋放。