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















网友评论