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