目录
- ARC下如何避免内存泄露?如何检测?
- 你是如何做内存优化的?
- __block你知道多少?在什么时候使用?
- 关于防止APP崩溃你做了哪些努力?
- 你是如何做线上Bug定位的?
- 关于经验和技巧还有什么想说的?
1. ARC下如何避免内存泄露?如何检测?
-
避免:
- 注意使用block时是否造成循环引用,使用
__weak
配合__strong
关键字打破闭环不是所有的block都要避免循环引用。所谓“循环引用”,指的是双向的强引用(即self强引用block,block也强引用self),单向的强引用则不用担心,系统的某些block api(如
UIView
的block版本写动画)或者第三方库如MJRefresh,SDWebImage等未形成闭环均不用考虑循环引用问题。 - delegate使用
weak
声明比assign
好,因为使用weak
其delegate
成员变量会在持有者销毁时自动被赋为nil(对象回收时Weak指针自动被置为nil的实现原理,典型应用:一句话移除所有通知[[NSNotificationCenter defaultCenter] removeObserver:self];
),此时向空对象发消息objc_msgSend(obj, @selector(methodName:)
判断obj
为 nil 则selector
也为 nil 从而直接返回 0(nil) 而不会引起crash - 注意
CoreFoundation
对象的使用,使用完成后记得主动调用相应的CFRelease()
方法 - 例如
NSTimer
加入到Runloop中,界面消失时记得将定时器销毁,建议使用NSTimer
的分类(如YYKit的NSTimer+YYAdd),并在dealloc
中调用[timer invalidate]
停止定时器
- 注意使用block时是否造成循环引用,使用
-
检测:
检测代码中是否存在循环引用问题,可使用 Facebook 开源的一个检测工具FBRetainCycleDetector,这里有两篇很棒的文章翻译并介绍了它的相关用法:
[译文]在iOS上自动检测内存泄露
FBMemoryProfiler 基础教程
- 使用Xcode -> Product -> Analyze 分析memory警告,可以发现局部变量忘记release的情况(或者申请了内存却未使用)
- 在Xcode -> Debug area中点击
Debug Memory Graph
或Debug View Hierarchy
按钮,在Debug navigator区查看紫色感叹号情况,缺点是每个屏幕都要点击一下