需要一些帮助来理解核心数据中的错误

时间:2011-09-21 17:25:09

标签: iphone core-data fault

我有一个使用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的子类的文档。

2 个答案:

答案 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,所以我会说你正在做正确的事情。但是,非常有兴趣听听有关该主题的其他想法。