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



我有一个UIButton,我已经在上面设置了accessibilityLabel。为什么当我尝试使用点表示法打印它时,控制台找不到accessibility标签属性?

(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

accessibilityLabel不是UIButton的属性。这是一种由非正式UIAccessibility协议定义的方法,UIButton恰好对此做出响应。lldb对这些事情往往比clang更严格,而且用点表示法引用非属性并不严格合法。

事实上,它是一个非正式的协议,这实际上让lldb上的事情变得更加困难。您无法轻易确定UIButton实现了该协议(从技术上讲,它是NSObject的扩展(。出于这个原因,我们不再那么频繁地使用非正式协议。

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

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

相关内容

  • 没有找到相关文章

最新更新