调试UIViewAlertForUnsatisfiableConstraints

作为iOS平台上的应用程序开发人员,我经常遇到如下约束警告,

  无法同时满足约束条件。  以下列表中至少有一个约束是您不想要的约束。  尝试以下操作: (1)查看每个约束,并尝试找出不期望的约束;  (2)查找添加了一个或多个不必要约束的代码并进行修复。   “” “, ” “, ” “, ” <“,” “ ”, “ “, ” “  将尝试通过以下方式恢复  打破约束  
在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以在调试器中捕获该断点。

当我看到此类问题时,我们立即使用UIViewAlertForUnsatisfiableConstraints设置了符号断点 当我再次运行该应用程序以重现该问题时,Xcode将在上述约束警告处停止。

现在如何处理指针和汇编代码?

经过研究,我找到了一些调试此断点的解决方案。 如果您看到上面的图像,您会看到%rbp,%rsp,%rbx,%r15等字符串。这些属性保存视图和约束的地址,这是约束问题背后的原因。 我们可以在Xcode控制台中打印它们,以查看有关此内容的更多详细信息。

我通常从打印rbx开始,因为根据我的经验,它通常是NSArray ,其中包含该问题涉及的所有视图和约束。

打开Xcode控制台并执行以下命令。

  po $ rbx 

以上结果看起来与警告消息完全一样,因此,我们可以如何处理它。 三想记住这里,

  • 程序执行在断点处停止
  • 您具有约束问题所涉及的所有视图的内存地址。
  • LLDB使您可以在运行时评估obj-c表达式

如果查看po $ rbx命令的结果,可以看到view的内存地址。 例如UIView:0x7f94ff5b3c70

我通常会为某些视图提供外观并继续执行程序。

使用从上一个打印命令获得的内存地址,在Xcode控制台中执行以下命令。

  ex [(UIView *)0x7f94ff5b3890 setBackgroundColor:[UIColor greenColor]] ex [(UIView *)0x7f94ff5b3c70 setBackgroundColor:[UIColor greenColor]] 

现在点击继续程序执行按钮以运行该应用程序。 现在,您将在屏幕上看到两个视图,一个为红色,另一个为绿色。

现在,您知道哪些视图可能导致约束问题。 如果所有视图都正常,则以不同的视图重复步骤,直到找到问题为止。

有时,您更改颜色的视图可能会掩埋在其他视图下,因此不会立即在屏幕上可见。 在这种情况下,您可以使用Debug View Hierarchy来更深入地了解您的视图层次结构。

在视图层次结构的快照中,您可以清除所有顶级视图,直到看到“彩色”视图,

希望本文对您有所帮助。 如有任何疑问,请发表评论。


对不起,语法不好