为啥调试器不知道我的 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 生成的托管对象类上的方法? (附代码)的主要内容,如果未能解决你的问题,请参考以下文章
为啥 EF Core 2.0 会生成多个重复的 SQL 语句?
iOS Core Data managedObjectContext:不知道选择器的类方法
为啥在 Core Data container.performBackgroundTask() 之后不触发 tableView.reloadData()