内存泄漏检测
检测内存泄漏的几种方式
静态检测分析
静态检测分析又分为两种,一种是手动静态分析,一种是自动静态分析
-
手动
-
自动
设置成YES
,每次编译的时候都会帮你检测分析,上线的时候改成默认
静态分析的功能有限,只是静态的帮你分析,app运行期间发生的事它并不能帮你检测,比如循环引用什么的并不能检测出来
动态检测方法(instrucment工具)
这种方式比静态分析要好,但也不一定完全能检查出内存泄漏等问题
析构打印
-(void)dealloc{
NSLog(@"%s",__func__);
}
其实就是看控制器有没有走dealloc
,推荐开发过程中使用,内存泄漏主要也要在开发过程预防发生,所以正在开发的过程中根据析构打印是一件比较简单方便的事,也是一个好习惯,比较实用吧
如果走了dealloc
,那么当前控制器肯定是没内存泄漏了,但是里面的对象有没有就确定了
第三方工具
自动化检测工具
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x60000024ef40'
在buddle Seeting 里面的Other Linker Flags 中添加-ObjC就可以了。
MLeaksFinder
项目直接pod就行了
简单小结:
1.在使用block时,如果block内部需要访问self的方法 属性 或者实例变量应当使用weakself
2.如果在block内需要多次访问self,则需要使用strongself
3.如果在block内部存在多线程环境访问,则需要使用strongself
4.block本身不存在多线程之分,block执行是否是多线程,取决于当前的持有者是否是以多线程的方法来调用他
但是点击发起微信支付