我有一个类,Song,它是NSManagedObject的子类。我正在使用GDB来尝试找出我遇到的问题,并且很难使用gdb在我的类上调用访问器。
Song.h:
@property (nonatomic, retain) NSString * title;
Song.m:
@dynamic title;
在调试器中,我看到对象上的“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.
我有可能在这里做一些非常愚蠢的事情,但我做错了什么?是否有任何方法可以内省对象并查看它将使用GDB响应哪些消息?
答案 0 :(得分:26)
您可以使用gdb
方法在valueForKey:
中访问动态生成的属性,如[aSong valueForKey:@"title"]
中所示。 (如果你是一个受虐狂,这种技术也适用于合成属性,但实际上它只在检查NSManagedObject
及其子类时才派上用场。)
答案 1 :(得分:3)
可悲的是,这就是gdb
行为的方式。而不是询问对象是否会响应选择器,它似乎只是在编译时现在或 来查看对象的实现(我还没有找到然而)。由于在消息转发过程中处理了核心数据属性,因此调试器不相信NSManagedObject
将响应属性选择器。
这可能值得向Apple报告错误,因此他们可以修复调试器。