我注意到自定义NSManagedObject
子类实例在从gdb调用它们时不响应它们的访问器。我总是打电话给valueForKey:
和setValue:forKey:
。
我认为这与它们在运行时生成的属性访问器有关(NSManagedObject
子类具有@dynamic
属性访问器)?在gdb中命中断点时,ObjC运行时到底发生了什么?
请注意,我正在尝试使用简单的消息传递语法来获取对象的属性,而不是点语法。
答案 0 :(得分:4)
Gdb包含自己的代码来解决消息实现。它知道对象的结构,遍历其类层次结构,将选择器解析为IMP并通过其自己的机制调用它。我相信它可以做到这一点,所以它可以做“步入”之类的东西,即跳转到一个实现并停在那里(而不是跳到objc_msgSend
并停在那里,你不会想要的。)
由于NSManagedObject不合成方法IMPs,而是使用动态调度和转发来解析其setter / getter,因此gdb无法找到IMP,因此失败。 KVC方法由NSObject提供,所以它们总是在那里;因为它们是本机执行的,所以它们将使用适当的调度机制,然后NSManagedObject使用它来解析适当的访问器。