常见原因:
1. NSTimer
target:self 增加了 viewController 的 retain count,self 强引用了 timer,timer 强引用了self,造成了循环引用,解决方案:[timer invalidate];
2. delegate
delegate 会造成和 viewController 的循环引用,解决方案:用 weak 修饰 delegate
3. block
block 会造成循环应用,解决方案:当 self 与 block 互相持有时,使用__weak/__strong;
4.非OC对象的处理
解决方案:比如队列,通过 dispatch_queue_creat 函数生成的 Dispatch Queue 在使用结束后需要通过 dispatch_release 函数释放;
5. AFN
解决方案:保证 AFHTTPSessionManager 只有一个,使用单例,但是异步会有问题,同一时间同时申请 manager 时,会有线程申请不到;
另外一种解决方案:在网络请求的 block 内把 task 取消掉,
__weak typeof(manager) weakManager = manager;
然后在成功和失败的回调中添加
[weakManager invalidateSessionCancelingTasks:YES];
6. 大次数循环
for(int i = 0;i < 1000000;i++){
xxx
}
解决方案:
for(int i = 0;i < 1000000;i++){
@autoreleasepool {
xxx
}
}
检测:
1.静态分析方法(Analyze):Xcode -> Product -> Analyze
2.动态分析方法(Leaks):Xcode -> Product -> Profile -> Leaks