我是如何检测内存泄露的
2016-08-02 00:00
148 查看
摘要: 我是如何检测内存泄露的
招聘信息:
高级PHP开发工程师
iOS高级研发工程师
iOS开发工程师
高级iOS手机应用软件开发工程师(培训讲师)
高级Cocos2d-x游戏开发工程师(培训讲师)
iOS手机软件开发工程师
资深iOS开发工程师
iOS 开发工程师
iOS高级工程师
java高级软件工程师
高级iOS开发工程师
在iOS开发中我们经常用到block,无论是GCD还是参数传递,block都是一个很不错的选择。然而有利也有弊,block会产生循环引用,但是这代码通常不会报错,只是运行结果不正确!于是花费大量时间打断点调试,发现原来问题在这里:
这里的block中用了self,导致viewcontroller不能调dealloc,每次被这个坑了的时候,内心都几乎是崩溃的...... 于是写了个脚本来检测这个问题,效果大大的好。
以下是正题
block 长什么样?它大概长这样子:一个^后面有{和},介于此我们就能查到几乎所有代码里面的block了,那么block里面的self怎么识 别?weakSelf算吗,当然不算,按照语法:如果一个self字段它的前后都不是字母数字下划线(好好理解下这句话),那它就是我们要找的self。 按着这个思路block里面的self便无所遁形了。然后按着如下写脚本(代码在文末):
遍历工程里面的所有.m文件
查找^
匹配后面的一对{}记住位置
查找{}里面符合规则的self
调用mac的通知中心通知自己哪里有问题
最终效果如下:
想要调用mac的通知中心,首先需要pyobjc库,安装后脚本就可以正常运行了,需要设置的参数如下:
1.projectPath(工程所在路径)
如:projectPath = "/Users/yuyang/Documents/techwolf/mobile_ios"
2.noPath(不检测路径)
如:noPath = ['ThirdLibs','iosTools']或:noPath = None(检测工程下所有路径)
如果这样用你觉得用着麻烦(毕竟每次都要开着终端),那么可以用炮筒机器人来减轻工作量,炮筒机器人是mac自带的就是这个:
首先打开它
把它拖到右面的工作区,然后选择python脚本
清除里面的内容,把脚本的代码拷贝进去,最后生成这个app:
当然你也可以设置这个为开机启动项。
运行时的效果这样:
最后,奉上代码: https://github.com/hades0918/CheckLeak,如果你觉得好用,给我个star鼓励下,谢谢!
我是如何检测内存泄露的
block内存泄露pythoniOS循环引用招聘信息:
高级PHP开发工程师
iOS高级研发工程师
iOS开发工程师
高级iOS手机应用软件开发工程师(培训讲师)
高级Cocos2d-x游戏开发工程师(培训讲师)
iOS手机软件开发工程师
资深iOS开发工程师
iOS 开发工程师
iOS高级工程师
java高级软件工程师
高级iOS开发工程师
在iOS开发中我们经常用到block,无论是GCD还是参数传递,block都是一个很不错的选择。然而有利也有弊,block会产生循环引用,但是这代码通常不会报错,只是运行结果不正确!于是花费大量时间打断点调试,发现原来问题在这里:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{ self.view.backgroundColor = [UIColor redColor]; });
这里的block中用了self,导致viewcontroller不能调dealloc,每次被这个坑了的时候,内心都几乎是崩溃的...... 于是写了个脚本来检测这个问题,效果大大的好。
以下是正题
block 长什么样?它大概长这样子:一个^后面有{和},介于此我们就能查到几乎所有代码里面的block了,那么block里面的self怎么识 别?weakSelf算吗,当然不算,按照语法:如果一个self字段它的前后都不是字母数字下划线(好好理解下这句话),那它就是我们要找的self。 按着这个思路block里面的self便无所遁形了。然后按着如下写脚本(代码在文末):
遍历工程里面的所有.m文件
查找^
匹配后面的一对{}记住位置
查找{}里面符合规则的self
调用mac的通知中心通知自己哪里有问题
最终效果如下:
想要调用mac的通知中心,首先需要pyobjc库,安装后脚本就可以正常运行了,需要设置的参数如下:
1.projectPath(工程所在路径)
如:projectPath = "/Users/yuyang/Documents/techwolf/mobile_ios"
2.noPath(不检测路径)
如:noPath = ['ThirdLibs','iosTools']或:noPath = None(检测工程下所有路径)
如果这样用你觉得用着麻烦(毕竟每次都要开着终端),那么可以用炮筒机器人来减轻工作量,炮筒机器人是mac自带的就是这个:
首先打开它
把它拖到右面的工作区,然后选择python脚本
清除里面的内容,把脚本的代码拷贝进去,最后生成这个app:
当然你也可以设置这个为开机启动项。
运行时的效果这样:
最后,奉上代码: https://github.com/hades0918/CheckLeak,如果你觉得好用,给我个star鼓励下,谢谢!
相关文章推荐
- 如何在solaris上检测内存泄露
- C语言中的内存泄露,如何避免,如何检测
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(二)
- 如何检测内存泄露,如何进行内存优化? 【面试题】
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句
- 在Windows中 , 如何用leakdiag “自动”检测内存泄露 (自动记录日志)
- 如何有效检测内存泄露
- 如何在Solaris上检测内存泄露
- JAVA内存泄露检测工具如何使用
- 如何检测内存泄露
- java如何减少内存泄露,检测内存泄露,改进的方法
- 如何在Android Studio中使用LeakCanary检测内存泄露
- 如何检测内存泄露
- 如何在vs下linux下检测内存泄露
- 如何检测内存泄露?
- C语言中的内存泄露,如何避免,如何检测
- vc++ 如何检测内存泄露
- 如何用 Valgrind 在 Linux 检测内存泄露
- 如何检测非MFC程序的内存泄露?
- 如何用VS工具检测内存泄露