OC-开发案例收集

利用 Xcode 内存表(Debug Memory Graph)

2018-10-31  本文已影响36人  丶淡茗

iOS内存泄漏定位

Xcode8以后的调试技能又增加了一个黑科技:Memory Graph。简单的说就是可以在运行时将内存中的对象生成一张图

一、 定位循环引用

  1. 利用xcode 8 新出 Debug Memory Graph 工具

  2. 查看内存堆栈信息
  3. 上图中 jjview_block 强引用了 testViewController

  4. 右键 jjview 选择 jump To ... 进行跳转

  5. 找到强引用控制器的 block

  6. 切换到被强引用的 testViewController 里面,进行全局搜索使用 block 的地方

  7. 发现 blcok 里面使用了 self 没有进行 __weak 解引用


二 、定位泄漏思路

  1. 同上定位循环引用第一步相同

  2. 查看内存堆栈信息,点击下方图片位置按钮
  3. 查看 viewController 泄漏信息,发现信息很简单

  4. 根据控制器引用链往前推导,最终发现是 UIWindow 的泄漏,但是 UIWindow 泄漏信息查看过于复杂

  5. 思考 UIWindow 创建都是进过 alloc init 从中得出 - (instancetype)init 必定会被调用,扩展出 UIWindow+Extension 分类,里面重载 - (instancetype)init 方法,并且在初始化地方打上断点进行调试

  6. 查看堆栈,发现系统调用了 _loadMainStoryboard... 方法

  7. 思考 _loadMainStoryboard... 方法对应的是 info.plist 里面 Main.storyboard 的调用,发现 plist 里面没有删除 Main

  8. AppDelegate 里面又进行 UIWindow 手动创建,最终发现问题所在 plist 里面没有删除 Main

GitHub地址https://github.com/wanghui9309

上一篇 下一篇

猜你喜欢

热点阅读