iOS | XCode8新增可视化循环引用调试工具

英文地址:Memory Graph Debugger Tips

译者的话:
目前关于Debug Memory Graph的中文资料很少,
甚至没有一篇有内容的.笔者在查阅资料时发现此文,翻译过
来和大家一起分享.翻译过程中,补充了一些截图(原文没有图片).
交流中很少翻译成中文或者没有统一中文翻译的词,依然使用英文原词.

Memory Graph Debugger 使用方法

我没有太多要分享的,因为我使用Xcode里新增的内存图调试工具仅约一天,但我确实有一些建议要分享给您.

  • 点击调试栏中的Sleestak-fingers按钮启动. 它处在Cyberman(查看视图层次工具)按钮和paper airplane(模拟器定位)按钮之间.换言之,它是Xcode的工具,不包含在Instruments里.


    Sleestak-fingers button
调试工具栏
  • 关闭僵(zombies)尸对象.开启scheme检查僵尸对象功能会干扰此功能(提示:一般情况下关闭僵尸对象功能,除非你必须使用).

  • 开启Malloc Stack Logging(我觉得开启它以展示栈回溯(backtraces)是个正确选择).


    iOS | XCode8新增可视化循环引用调试工具_第1张图片
    zombies and Malloc Stack Logging
  • 在Xcode中显示右边栏,点击内存对象图中的对象查看它的类,层次和栈回溯.


    iOS | XCode8新增可视化循环引用调试工具_第2张图片
    右边栏
  • 对象之间会有一根带有标签的线,这根线代表对象的引用关系.点击线,在右边栏可以看到引用类型(weak, strong or unknown)和引用关系(source and destination).


    iOS | XCode8新增可视化循环引用调试工具_第3张图片
    Snip20161017_1.png
  • 单击对象右上角中心带有双向箭头的圆环,展开对象树.点击相同地方复原.点击左边栏对象可以聚焦对应对象上.

  • 在左边栏寻找紫色的感叹号,这些地方可能有问题.然而,大部分问题检测不到,需要你仔细检查(译者注:不要因为这就对Memory Graph Debugger失望,借助它,你可以自己发现这些问题).

我已经使用它解决了两个bug,都节约了很多时间.很有必要提醒你你可能碰到的问题.

Notification block

我个人不会用block设置一个NSNotification观察者,在 init 和 viewDidLoad里添加没有关联的代码,会使代码变得杂乱并且很危险.

除非你很细心,否则它很危险.它可能捕获一个引用自己的强引用,造成对象释放不掉.我不喜欢像这需要做一些额外处理的APIs.

很确定,这只是其中一例.

在memory graph debugger工具中,capture标签告诉我们哪里捕获了block,通过它,你可以很快找到它.

(参阅:来自2015年的: How Not to Crash #3: NSNotification.)

View controller / view retain cycle

编程的一般原则是对象应该知道其他们的children,但不应该知道它们的parents(译者注:此处的对象指View controller or view retain cycle).

然而,有些时候视图需要知道其所在的控制器.这不是常常需要,但一些时候是不得已的办法.

编程规则也指出child需要知道parent,依然不能强引用parent.

确实一个保留引用问题的就发生了:一个视图保留了它所在的视图控制器.这个例子解决办法就是改用弱引用.

再一次,memory graph debugger工具使我准确地发现了这个bug.现在,我可以看到app里发生了什么,这是以前不可能的事.

如果您有什么问题,欢迎一起探讨.转载请注明出处.

你可能感兴趣的:(iOS | XCode8新增可视化循环引用调试工具)