我有一个使用 NSManagedObject 的自定义子类的核心数据实体。我有一些与 Core Data 属性或关系无关的实例变量和属性。我正在做的事情的一个例子是这样的:
@interface Root : NSManagedObject
{
Foo *foo;
Bar *bar;
}
@property (nonatomic, retain) Foo *foo;
@property (nonatomic, retain) Bar *bar;
// Core Data generated
@property (nonatomic, retain) Node *relationship;
@property (nonatomic, retain) NSString *attribute;
-(void)awake;
@end
@implementation Root
@synthesize foo;
@synthesize bar;
@dynamic relationship;
@dynamic attribute;
-(void)awakeFromInsert {
[super awakeFromInsert];
[self awake];
}
-(void)awakeFromFetch {
[super awakeFromFetch];
[self awake];
}
-(void)awake {
Foo *newFoo = [[Foo alloc] init];
self.foo = newFoo;
[newFoo release];
// bar is not automatically initialized, but can be set by something external
}
-(void)didTurnIntoFault {
[foo release];
foo = nil;
[bar release];
bar = nil;
[super didTurnIntoFault];
}
@end
现在在我的应用程序中,当应用程序启动时,我通过一次获取请求获得一个 Root 实例,并保留它直到应用程序退出。(实际上它有点复杂,因为您可以删除根实例并创建一个新实例,但一次最多存在一个并保留它。)所以我希望在我的应用程序退出之前永远不会调用 didTurnIntoFault。如果是这样,那么在某些时候我会参考 root.foo 或 root.bar 并得到 nil。这对我的应用程序来说是一个错误。Root 实例的 foo 和 bar 应该始终具有非 nil 值;foo 是在实例加载时创建的,而 bar 在获取根实例后立即由调用者设置。
如果我的代码保留了 NSManagedObject,我可以依赖没有调用 didTurnIntoFault 吗?
如果我不想调用 didTurnInfoFault,为什么要调用它?嗯,有时间我得打扫一下。如果我不想在程序退出之前释放这些实例变量,也许我真的应该将该代码放入 dealloc 中。但我想我阅读了一些不鼓励对 NSManagedObject 的子类使用 dealloc 的文档。