1. 避免block、不同对象互为强属性等的循环引用

 

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

 

3. performSelector : afterDelay: 该方法也可能导致内存泄露。
例如以下代码:
[self performSelector:_cmd withObject:interval afterDelay:timeInterval];
避免泄露方式参考如下代码:
// 如果没有取消之前还没有来得及执行的延时函数,则将可能导致内存泄露。因为 performSelector延时执行时,会在等待时先将interval的引用计数+1,执行完之后再-1。
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(autoScroll:) object:nil];

 

4. 使用NSTimer时,忘记使用invalidate 方法销毁timer.
原因:
在使用 NSTimer addtarget 时,为了防止 target 被释放而导致的程序异常,timer 会持有 target,所以这也是一处内存泄露的隐患。

 

5. try catch
原因:抛出异常的对象往往得不到释放(即使在MRC模式下,在try方法内写了release也无济于事),如果那个抛出异常的对象是在try方法内定义的,然后要在catch 或者final 的方法中去找到那个对象进行销毁,比较麻烦。

 

6. UIViewController中存在无限循环的animation

 

7. 忘记释放 CoreFundation/CoreGraphics 相关函数
注:CG/CF 开头的函数,有创建就要有释放,这样可以有效降低内存泄漏的风险

 

8. 后台线程默认并未包含在autoreleasepool 中。APP提供的写在main.m中的那个autoreleasepool 仅仅是作用在主线程中。所以background的方法也最好使用一个autoreleasepool包裹。

 

参考:
(多帖总结) ARC下可能的内存泄露情况

发表评论

电子邮件地址不会被公开。 必填项已用*标注

浙公网安备 33010602005964号