Xcode LLDB打印语句失败 - NSUndoManager

29
我设置了一个断点并想打印出我的UITextField的superview。我输入po myTextField.superview但是收到以下错误:
error: instance method 'undoManager' has incompatible result types in different translation units ('id' vs. 'NSUndoManager *')
note: instance method 'undoManager' also declared here
error: 1 errors parsing expression

这是什么意思,我怎么才能打印我的superview?我在网上找到了一个提供笨拙代码解决方法的链接: http://openradar.io/15890965,但我希望有更好的解决方案。

同样的故事在这里:我尝试在UITableView的类别上使用po tableView.gestureRecognizers - Drux
3
我曾多次尝试使用po命令查看frame、bounds、recursiveDescription、constraints等(只使用内置方法),但是经常会遇到这个错误。看起来是一个严重的Xcode/lldb错误。 - kylefinn
5个回答

2

全世界的人们:我有一个答案!

要避免所有UIKit错误:在键入po语句之前,输入以下行 -- expr @import UIKit

如果您想全局启用此选项,则在应用程序委托中添加以下断点:

enter image description here

感谢Craig Hockenberry和Steve Streza提供的更新(可以在这里找到)。


本文告诉您如何为所有项目打开此功能:http://merowing.info/2015/12/little-things-that-can-make-your-life-easier-in-2016/ - rizzes

1

你是否有针对'myTextField'的自定义访问器方法?我已经多次看到这个问题,通常是由于po尝试打印在第一次调用getter时初始化的对象属性引起的。例如,如果我尝试在UITableViewCell上运行'po self.imageView.contentMode',我会得到相同的错误。尝试将断点移动到您知道'myTextField'已完全初始化的代码点。


我没有为myTextField编写自定义访问器方法。不过这是个好想法。 - rizzes

1
我在调试时用的解决方法是显式转换所有内容,以避免出现这个错误。在你的情况下,我会这样做:
po [(UITextField *)myTextField superView]

从最初的测试来看,这对我来说似乎有效。然而,上面链接中的第二条评论(http://openradar.io/15890965)声称即使明确转换类型也会发生这种情况。还有其他人想要加入讨论吗? - rizzes
我尝试了显式转换,但仍然出现这个错误。例如:po (NSString *)[((IBAdBannerView *)adView) recursiveDescription] - Kyle Robson

0

我在Xcode 5.1.1中遇到了这个错误,通过退出Xcode 5.1.1并尝试Xcode 6来解决它。对于某些人来说,重新启动Xcode 5.1.1也可能有效。


我还没有在Xcode 6中发现这个错误,所以苹果可能已经修复了它。不过,在我们确定之前还需要一些时间。 - rizzes

0

myTextField 真的指向了一个 UITextField 吗?这是出现此错误的原因之一。例如,下面的代码将编译通过,如果我在第三行设置断点,我可以输入 po b.superview 来复现你看到的错误。

NSString *a = @"not a view";
UITextField *b = (UITextField *)a;
UIView *view = b.superview;

尝试在您的LLDB提示符下键入po [myTextField class],以查看它是否实际上是一个UITextField。它可能是另一种类型的对象,或者是nil

myTextField 确实指向了一个 UITextField(通过 outlet)。 - rizzes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接