【问题标题】:why isn't the debugger aware of methods on my Core Data generated managed object classes? (code attached)为什么调试器不知道我的 Core Data 生成的托管对象类上的方法? (附代码)
【发布时间】:2011-04-08 21:43:54
【问题描述】:

为什么调试器不知道我的 Core Data 生成的托管对象类的方法? (附代码)所以:

  • 我有一个 XCode 生成的托管核心数据对象类,称为 WEView
  • 我注意到调试器似乎不知道它的方法?
  • 见下面的控制台输出。最初的“po self.weView”似乎可以工作,但是当引用任何对象实例变量时不起作用?

控制台输出

(gdb) po self.weView
<WEView: 0x4f6a3f0> (entity: WEView; id: 0x4f68710 <x-coredata://CB3E1660-4BA8-4700-ADDB-A32CD44D56B6/WEView/p3> ; data: {
    title = "Weekend Items";
    weEndDayTime = "(...not nil..)";
    weStartDayTime = "(...not nil..)";
})
(gdb) po self.weView.title
There is no member named title.
(gdb) po [self.weView title]
Target does not respond to this message selector.
(gdb) 

header - 由 Xcode 生成

@interface WEView : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) id weStartDayTime;
@property (nonatomic, retain) id weEndDayTime;

@end

【问题讨论】:

    标签: iphone xcode ios core-data


    【解决方案1】:

    那是因为确实没有名为 title 的 ivar,也没有 getter 或 setter 对。这也是您使用@dynamic 而不是@synthesize 的原因。当您访问例如。标题,这在现实中会是这样的:

    [myObject valueForKey:@"title"];
    

    同样,设置标题是这样的:

    [myObject setValue:foo forKey:@"title"];
    

    所以基本上 NSManagedObject 只是一个包装数据库获取或访问缓存的包装器,但您永远不会访问对象的一些真实 ivars(您可以尝试运行时函数来确定 NSManagedObject 子类的 ivars)。

    如果你还想使用[self.view title],你需要覆盖它。这是一个例子:

    - (NSString *)title
    {
       NSString *value;
       [self willAccessValueForKey:@"title"];
       value = [self primitiveValueForKey:@"title"];
       [self didAccessValueForKey:@"title"];
    
       return value;
    }
    

    当然,这不是原子吸气剂,它比正常方式慢,但是嘿,它有效。

    【讨论】:

    • 哦 - 好的 - 任何重新调试的建议 - 大多数人只是保持原样并了解情况,或者是否有一些调整可能有助于调试?我猜是前者,但我想我会问......哦,我确实读过有人推荐“mogenerator”而不是 XCode 的代码生成器,但我猜它可能会产生相同类型的代码?
    • 他已经给了你调试用的字符串——简单地说“po [myObject valueForKey:@"title"]" 或者在你的确切情况下是"po [self.weView valueForKey:@"title"]"
    • 是的,明白 - 询问课堂上的调整,以便人们可以使用“po self.weView.title”
    • @Greg:您可以“覆盖”访问器/设置器来设置值/读取它。我已经用一个例子更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多