美文网首页OC-开发案例收集
利用 Xcode 内存表(Debug Memory Graph)

利用 Xcode 内存表(Debug Memory Graph)

作者: 丶淡茗 | 来源:发表于2018-10-31 21:17 被阅读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

    相关文章

      网友评论

        本文标题:利用 Xcode 内存表(Debug Memory Graph)

        本文链接:https://www.haomeiwen.com/subject/qeeztqtx.html