在gdb中ObjC运行时和动态访问器会发生什么?

时间:2011-11-16 18:40:46

标签: objective-c core-data gdb

我注意到自定义NSManagedObject子类实例在从gdb调用它们时不响应它们的访问器。我总是打电话给valueForKey:setValue:forKey:

我认为这与它们在运行时生成的属性访问器有关(NSManagedObject子类具有@dynamic属性访问器)?在gdb中命中断点时,ObjC运行时到底发生了什么?

请注意,我正在尝试使用简单的消息传递语法来获取对象的属性,而不是点语法。

1 个答案:

答案 0 :(得分:4)

Gdb包含自己的代码来解决消息实现。它知道对象的结构,遍历其类层次结构,将选择器解析为IMP并通过其自己的机制调用它。我相信它可以做到这一点,所以它可以做“步入”之类的东西,即跳转到一个实现并停在那里(而不是跳到objc_msgSend并停在那里,你不会想要的。)

由于NSManagedObject不合成方法IMPs,而是使用动态调度和转发来解析其setter / getter,因此gdb无法找到IMP,因此失败。 KVC方法由NSObject提供,所以它们总是在那里;因为它们是本机执行的,所以它们将使用适当的调度机制,然后NSManagedObject使用它来解析适当的访问器。