gdb:在NSManagedObject子类上调用访问器方法?

Pau*_*ald 8 gdb objective-c ios

我有一个类,Song,它是NSManagedObject的子类.我正在使用GDB来尝试找出我遇到的问题,并且很难使用gdb在我的类上调用访问器.

Song.h:

@property (nonatomic, retain) NSString * title;
Run Code Online (Sandbox Code Playgroud)

Song.m:

@dynamic title;
Run Code Online (Sandbox Code Playgroud)

在调试器中,我看到对象上的"title"字段,当我尝试使用访问器打印值时,如果我理解正确,它应该在运行时生成,它会给我一个错误:

 (gdb) po aSong  <Song: 0x59188d0>
 (entity: Song; id: 0x59162d0
 <x-coredata://99BE63F8-840A-47B5-A259-BCD74E1811C4/Song/p2>
 ; data: {
     composers = "<relationship fault: 0x4d62f30 'composers'>";
     dateCreated = nil;
     songLists = "<relationship fault: 0x59243c0 'songLists'>";
     title = "cancel?"; })  
 (gdb) p aSong.title  There is no member named
 title.
 (gdb) p [aSong title]
 Target does not respond to this message selector.
Run Code Online (Sandbox Code Playgroud)

我有可能在这里做一些非常愚蠢的事情,但我做错了什么?有没有办法反省一个对象,看看它将使用GDB响应什么消息?

Sco*_*bes 26

您可以gdb使用该valueForKey:方法访问动态生成的属性,如[aSong valueForKey:@"title"].(这种技术也适用于合成属性,如果你是一个受虐狂,但实际上它只在检查NSManagedObject及其子类时派上用场.)


小智 3

可悲的是,这就是gdb行为方式。它似乎只是现在在编译时查看对象的实现(我还没有弄清楚),而不是询问对象是否会响应选择器。由于 Core Data 属性是在消息转发过程中处理的,因此调试器不认为它NSManagedObject会响应属性选择器。

这可能值得作为错误报告给 Apple,以便他们可以修复调试器。