为什么Xcode中的控制台无法使用点表示法打印对象的属性?

时间:2014-05-01 18:57:06

标签: ios objective-c uibutton lldb

我有一个UIButton,我已经设置了accessibilityLabel。当我尝试使用点表示法打印时,为什么控制台无法找到辅助功能标签属性?

(lldb) po self.closeButton.accessibilityLabel
error: property 'accessibilityLabel' not found on object of type 'UIButton *'
error: 1 errors parsing expression
(lldb) po [self.closeButton accessibilityLabel]
topsecretlabel

2 个答案:

答案 0 :(得分:5)

accessibilityLabel不是UIButton的属性。这是由{em>非正式 UIAccessibility协议定义的方法UIButton碰巧响应。 lldb对于这些事情往往比铿锵更严格,并且通过点符号来引用非财产并不严格合法。

事实上,它是一个非正式的协议实际上使得lldb上的事情变得更加艰难。您无法轻易确定UIButton是否实施了协议(它在技术上是NSObject的扩展名)。由于这个原因,我们不再使用非正式协议了。

答案 1 :(得分:1)

您可以指定作为ObjC属性声明的一部分的一件事是不遵循常规命名约定的setter和getter。因此,在不知道属性声明的细节的情况下,lldb不知道如何将点符号转换为正确的方法调用。如果它有调试信息,它可以完成这项工作。但我们尽量不要在调试器中猜测这种事情。因此,如果我们没有调试信息,您必须告诉我们setter是什么(通过手动将。符号转换为正确的方法调用。)

无论如何,您确实可以访问声明accessibilityLabel属性的头文件,因此这仍然可以正常工作。遗憾的是,clang中存在一个错误,它不会为类中的类别声明的属性发出调试信息。事实证明,accessibilityLabel是在NSObject的UIAccessibility类别中定义的。所以它没有调试信息。所以你不能在它上面使用点符号。