ARC下内存泄露的一些情况

  1. 循环引用
    A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。

这种问题常发生于把delegate声明为strong属性了。

上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。

  1. 死循环

    如果某个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。

参照资料: http://www.aichengxu.com/view/30206

  1. block的循环引用:

这个例子的问题就在于在使用 block 的过程中形成了循环引用:self 持有 networkFetecher;networkFetecher 持有 block;block 持有 self。三者形成循环引用,内存泄露。

4.performSelector 系列
performSelector 顾名思义即在运行时执行一个 selector,最简单的方法如下

  • (id)performSelector:(SEL)selector;

但 performSelector 相比直接调用更加灵活

SEL selector;
if (/ some condition /) {
selector = @selector(newObject);
} else if (/ some other condition /) {
selector = @selector(copy);
} else {
selector = @selector(someProperty);
}
id ret = [object performSelector:selector];

这段代码就相当于在动态之上再动态绑定。在 ARC 下编译这段代码,编译器会发出警告

正是由于动态,编译器不知道即将调用的 selector 是什么,不了解方法签名和返回值,甚至是否有返回值都不懂,所以编译器无法用 ARC 的内存管理规则来判断返回值是否应该释放。因此,ARC 采用了比较谨慎的做法,不添加释放操作,即在方法返回对象时就可能将其持有,从而可能导致内存泄露。

  1. 在使用 NSTimer addtarget 时,为了防止 target 被释放而导致的程序异常,timer 会持有 target,所以这也是一处内存泄露的隐患。

6.try…catch

详细参照:https://www.zybuluo.com/MicroCai/note/67734
觉得总结的不错。