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