我有一个使用NSManagedObject的自定义子类的Core Data实体。我有一些与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。这对我的应用来说是一个错误。对于foo和bar,Root实例应始终具有非零值;加载实例时会创建foo,并在获取根实例后立即由调用者设置bar。
如果我的代码保留了NSManagedObject,我可以依赖didTurnIntoFault吗?
如果我不想调用didTurnInfoFault,我为什么要这样做?好吧,我有时候要清理一下。也许我真的应该把代码放到dealloc中,如果我不想在程序退出之前释放那些实例变量。但我想我读过一些不鼓励使用dealloc作为NSManagedObject的子类的文档。
答案 0 :(得分:2)
如果你的对象存在于底层文件存储中,那么由于内存不足警告等原因,它可能随时出现故障。
但是从你的代码中看起来你需要的只是一个简单的lazily-initialized属性,即覆盖'foo'getter,就像这样:
- (Foo *)foo
{
if (!foo) {
foo = [[Foo alloc] init];
}
return foo; // or [[foo retain] autorelease] if you need that safety
}
保证不会返回nil,如果你想在didTurnIntoFault中,你仍然可以释放并取出实例变量。下次调用getter时,将再次初始化新的ivar。
答案 1 :(得分:1)
我对文档的解释是,除非您自己(refreshObject:mergeChanges
以及文档中的其他几种方法http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/TP40003468-SW4),否则您的对象不会被转换为错误。它也明确告诉你不要覆盖dealloc,所以我会说你正在做正确的事情。但是,非常有兴趣听听有关该主题的其他想法。