《知识小集》
1 小集知识点地址
2 重现问题
- 运行时出现的2个约束警告(它们的产生都是通过重复添加约束造成的)
-
Demo地址
3 小集的方法
-
知识小集方法处理,下面是原话:
-
运行demo项目后,切换到【Debug View Hierarchy】操作界面
-
在 Debug Navigation 模块下,将约束问题的 view 的地址复制粘贴到 search 栏定,然后会直接定位到有约束问题对应 view 上。
4 Reveal方法
- 新版本的Reveal已经可以直接显示出冲突的约束了(没有钱买新版的Reveal😝)
5 Masonry 的 mas_key 或 MASAttachKeys()
5.1 使用 mas_key
self.testView.mas_key = @"testView";
....
self.stepper.mas_key = @"stepper";
原理是通过关联对象objc_setAssociatedObject
和 objc_getAssociatedObject
给UIView
分类添加属性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动态调试
- 使用下面命令,通过约束问题的 view 地址,使用 LLDB 命令,改变 view 的颜色,快速直观定位
(lldb) expr -l objc++ -O -- [(id)0x7fe3d2f216c0 setBackgroundColor: [UIColor redColor]]
计划 | 运行时 | 调试时 |
---|---|---|
7 Chisel(Facebook出品的LLDB调试命令集)
可以使用 show/hide 或 mask/unmask 命令
毫无疑问,这个 Chisel 是墙裂推荐啦,碾压了前面5种方法,简单便捷
REF
文/Jacob_LJ(简书作者)
PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载需联系作者获得授权,并注明出处,所有打赏均归本人所有!