本文具體介紹的為在ARC情況下容易引起內存泄漏的一些情況,僅為本人遇到的情況下的小總結,希望可以給大家提供一些幫助。
1.循環參照
A有個屬性參照B,B有個屬性參照A,如果都是strong參照的話,兩個對象都無法釋放。
這種問題常發生於把delegate聲明為strong屬性了。
例,
@interface SampleViewController
@property (nonatomic, strong) SampleClass *sampleClass;
@end
@interface SampleClass
@property (nonatomic, strong) SampleViewController *delegate;
@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里居然出現內存泄露,而且應為是arc,所以無法使用release,autorelease和dealloc去管理內存。正常情況下應該是不會出現這種情況的,某一個類若是ARC,則在這個類里面都應該遵循ARC的用法,而無需關心用到的類是否是ARC的,同樣,在非ARC類里面,就需要遵循內存管理原則。
用ARC,只是編譯器幫你管理了何時去release,retain,不用ARC就需要你自己去管理,說到底只是誰去管理的問題,所以你再好好看看,可能問題與ARC無關。
如果實在找不到問題,建議你找到泄露的那個對象,將其賦值為nil,因為ARC里面,一旦對象沒有指針指向,就會馬上被釋放。