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

Posted

技术标签:

【中文标题】为啥调试器不知道我的 Core Data 生成的托管对象类上的方法? (附代码)【英文标题】: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

【问题讨论】:

【参考方案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:您可以“覆盖”访问器/设置器来设置值/读取它。我已经用一个例子更新了答案。

以上是关于为啥调试器不知道我的 Core Data 生成的托管对象类上的方法? (附代码)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要 2 个或更多 Core Data 模型?

为啥 EF Core 2.0 会生成多个重复的 SQL 语句?

iOS Core Data managedObjectContext:不知道选择器的类方法

为啥在 Core Data container.performBackgroundTask() 之后不触发 tableView.reloadData()

为啥 Core Data 插入需要越来越长的时间?

Linux core dump文件生成与使用