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

Gre*_*reg 3 iphone xcode core-data ios

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

  • 我有一个名为WEView的XCode生成的托管Core Data对象类
  • 我注意到调试器似乎没有意识到它的方法?
  • 请参阅下面的控制台输出.最初的"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) 
Run Code Online (Sandbox Code Playgroud)

标题 - 由Xcode生成

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

@end
Run Code Online (Sandbox Code Playgroud)

Jus*_*Sid 9

那是因为确实没有名为title的ivar,也没有getter或者setter对.这也是你使用@dynamic和不使用的原因@synthesize.当你访问例如.标题,这将是现实中的这样的事情:

[myObject valueForKey:@"title"];
Run Code Online (Sandbox Code Playgroud)

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

[myObject setValue:foo forKey:@"title"];
Run Code Online (Sandbox Code Playgroud)

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

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

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

   return value;
}
Run Code Online (Sandbox Code Playgroud)

当然,这不是一个原子吸气剂,它比正常方式慢,但嘿,它的工作原理.

  • 他已经给你调试字符串 - 简单地说"po [myObject valueForKey:@"title"]"或在你的确切情况下"po [self.weView valueForKey:@"title"]" (2认同)