知识小集实践1-如何快速定位哪个 View 出现了约束警告?

《知识小集》

1 小集知识点地址

2 重现问题

  1. 运行时出现的2个约束警告(它们的产生都是通过重复添加约束造成的)
  2. Demo地址
    image.png

3 小集的方法

  1. 知识小集方法处理,下面是原话:


    知识小集
  2. 运行demo项目后,切换到【Debug View Hierarchy】操作界面


  1. 在 Debug Navigation 模块下,将约束问题的 view 的地址复制粘贴到 search 栏定,然后会直接定位到有约束问题对应 view 上。


    定位问题 view

    定位问题 control

4 Reveal方法

  1. 新版本的Reveal已经可以直接显示出冲突的约束了(没有钱买新版的Reveal😝)
    图片引自网络

5 Masonry 的 mas_key 或 MASAttachKeys()

5.1 使用 mas_key

    self.testView.mas_key = @"testView";
    ....   
    self.stepper.mas_key = @"stepper";

原理是通过关联对象objc_setAssociatedObjectobjc_getAssociatedObjectUIView分类添加属性mas_key


这里可以看到,Masonry 里面使用的方式是@selector(mas_key)方式作为 key 哦可以参考前面我的文章中说的最佳方式优点:Category底层实现分析4 - 关联对象AssociatedObject - 第2.2点

5.2 使用MASAttachKeys()

底层就是宏
MASAttachKeys(self.testView, self.stepper);

让我们看看,它怎么就直接将self.testView这个转为字符串的?
底层就是让传入的对象self.testView调用分类方法setMas_key,也就是关联对象 set 方法中的 key,它的类型是 void *,是可以直接传入对象的。

objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                         id _Nullable value, objc_AssociationPolicy policy)

所以,下面两种方式效果是一致的

    MASAttachKeys(self.testView, self.stepper);
    或
    self.testView.mas_key = self.testView;    
    self.stepper.mas_key = self.stepper;

6 LLDB动态调试

  1. 使用下面命令,通过约束问题的 view 地址,使用 LLDB 命令,改变 view 的颜色,快速直观定位
(lldb) expr -l objc++ -O -- [(id)0x7fe3d2f216c0 setBackgroundColor: [UIColor redColor]]
计划 运行时 调试时

7 Chisel(Facebook出品的LLDB调试命令集)

可以使用 show/hide 或 mask/unmask 命令

show/hide、mask/unmask

毫无疑问,这个 Chisel 是墙裂推荐啦,碾压了前面5种方法,简单便捷

REF


文/Jacob_LJ(简书作者)
PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载需联系作者获得授权,并注明出处,所有打赏均归本人所有!