ARC下内存泄露总结

来源:互联网 发布:vb 大规模数组赋值 编辑:程序博客网 时间:2024/06/03 21:55

循环引用

A有个属性B,B有个属性A,如果都是strong修饰的话,两个对象都无法释放。
这种问题常发生于把delegate声明为strong属性了。
例,

@interface SampleViewController@property (nonatomic, strong) SampleClass *sampleClass;@end@interface SampleClass@property (nonatomic, strong) SampleViewController *delegate;@end

循环未结束

如果某个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];}

指针未置空

因为当一个对象存入到集合中的时候,默认会保存它的强指针,如果最后不对这个集合进行清空操作,一样会有内存溢出的情况

Person * p = [[Person alloc] init];NSMutableArray * arr = [[NSMutableArray alloc] init];[arr addObject:p];把对象从集合中移除的时候,也会释放掉这个对象的强指针[arr removeObject:p];或者[arr removeAllObjects];而接下来才是重点:arr = nil;//如果不进行赋值为nil的操作,一样存在内存溢出的现象,赋值为nil系统会对其进行清空所有强指针的操作.p = nil;

非OBJC对象

ARC是自动检测OBJC对象的,非objc对象就无能为力了,比如C或C++等。C语言使用 malloc 开辟,free释放。C++使用new 开辟,delete释放。但是在ARC下,不会添加非OBJC对象释放语句,如果没去释放,也会造成内存泄露。

关于ARC与MRC的混编问题

当你迁移一个久工程到ARC模式下, -fobjc-arc 编译开关被默认的设置在所有的Objective-C 源代码上。 你可以使用-fno-objc-arc 来为特殊的class停用ARC 。在Xcode的 target的“Build Phases”标签, 打开Compile Sources group,展开源代码列表, 双击你想要修改的源代码的名字,再弹出框里输入-fno-objc-arc,然后点Done按钮。但是,一旦你的程序中有ARC和非ARC这两个CLASS之间交互的时候,就会莫名的出现内存泄露!而且泄漏得莫名其妙……最终解决方案只能重写其中一个class以保证两者均为ARC或者非ARC……

之前搜索ARC下的内存泄露,但是没有一个比较全面的总结。一般来说,ARC下的内存泄露会比MRC下少很多,因为不用自己去手动release。目前就总结了这么多,之后有新发现继续完善。

0 0
原创粉丝点击