ARC下內(nèi)存泄露問題
ARC下內(nèi)存泄露問題,有需要的朋友可以參考下。
iOS提供了ARC功能,很大程度上簡(jiǎn)化了內(nèi)存管理的代碼。
但使用ARC并不代表了不會(huì)發(fā)生內(nèi)存泄露,使用不當(dāng)照樣會(huì)發(fā)生內(nèi)存泄露。
下面列舉兩種內(nèi)存泄露的情況。
1,循環(huán)參照
A有個(gè)屬性參照B,B有個(gè)屬性參照A,如果都是strong參照的話,兩個(gè)對(duì)象都無法釋放。
這種問題常發(fā)生于把delegate聲明為strong屬性了。
例,
@interface SampleViewController
@PRoperty (nonatomic, strong) SampleClass *sampleClass;
@end
@interface SampleClass
@property (nonatomic, strong) SampleViewController *delegate;
@end
上例中,解決辦法是把SampleClass 的delegate屬性的strong改為assing即可。
2,死循環(huán)
如果某個(gè)ViewController中有無限循環(huán),也會(huì)導(dǎo)致即使ViewController對(duì)應(yīng)的view關(guān)掉了,ViewController也不能被釋放。
這種問題常發(fā)生于animation處理。
例,
比如,
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
tansition.repeatCount = HUGE_VALL;
[self.view.layer addAnimation:transition forKey:"myAnimation"];
上例中,animation重復(fù)次數(shù)設(shè)成HUGE_VALL,一個(gè)很大的數(shù)值,基本上等于無限循環(huán)了。
解決辦法是,在ViewController關(guān)掉的時(shí)候,停止這個(gè)animation。
-(void)viewWillDisappear:(BOOL)animated {
[self.view.layer removeAllAnimations];
}
內(nèi)存泄露的情況當(dāng)然不止以上兩種。
即使用了ARC,我們也要深刻理解iOS的內(nèi)存管理機(jī)制,這樣才能有效避免內(nèi)存泄露。
發(fā)生內(nèi)存泄露實(shí)在找不出問題所在的話,將那個(gè)對(duì)象直接賦值為nil,因?yàn)锳RC下對(duì)象沒有指針指向,馬上會(huì)被釋放。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注