导致内存泄漏的主要场景以及解决方法

Posted Mr.pengge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导致内存泄漏的主要场景以及解决方法相关的知识,希望对你有一定的参考价值。

本文具体介绍的为在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里面,一旦对象没有指针指向,就会马上被释放。
 

以上是关于导致内存泄漏的主要场景以及解决方法的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存泄漏导致内存溢出(OOM)的场景

安卓内存分析——常见内存泄漏场景二

静态内部类解决内存泄漏

Android 常见内存泄漏的解决方式

使用HandyJSON导致的内存泄漏问题相关解决方法

解决:setState() called after dispose() 内存泄漏问题