iOS内存泄漏定位
Xcode8以后的调试技能又增加了一个黑科技:Memory Graph。简单的说就是可以在运行时将内存中的对象生成一张图
一、 定位循环引用
-
利用
xcode 8新出Debug Memory Graph工具
-
查看内存堆栈信息
上图中
jjview的_block强引用了testViewController-
右键
jjview选择jump To ...进行跳转 -
找到强引用控制器的
block 切换到被强引用的
testViewController里面,进行全局搜索使用block的地方-
发现
blcok里面使用了self没有进行__weak解引用
二 、定位泄漏思路
同上定位循环引用第一步相同
-
查看内存堆栈信息,点击下方图片位置按钮
-
查看
viewController泄漏信息,发现信息很简单 -
根据控制器引用链往前推导,最终发现是
UIWindow的泄漏,但是UIWindow泄漏信息查看过于复杂 -
思考
UIWindow创建都是进过alloc init从中得出- (instancetype)init必定会被调用,扩展出UIWindow+Extension分类,里面重载- (instancetype)init方法,并且在初始化地方打上断点进行调试 -
查看堆栈,发现系统调用了
_loadMainStoryboard...方法 -
思考
_loadMainStoryboard...方法对应的是info.plist里面Main.storyboard的调用,发现plist里面没有删除Main -
AppDelegate里面又进行UIWindow手动创建,最终发现问题所在plist里面没有删除Main












