2

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

4

2 回答 2

2

如果您的对象存在于底层文件存储中,那么由于内存不足警告等原因,它可能随时出现故障。

但是从您的代码看来,您只需要一个简单的延迟初始化属性,即像这样覆盖“foo”getter:

- (Foo *)foo
{
    if (!foo) {
        foo = [[Foo alloc] init];
    }

    return foo; // or [[foo retain] autorelease] if you need that safety
}

这保证不返回 nil,如果你想在 didTurnIntoFault 中,你仍然可以释放和 nil 出实例变量。下次调用 getter 时,将再次初始化新的 ivar。

于 2011-09-21T17:50:25.110 回答
1

我对文档的解释是,除非您自己做,否则您的对象不会变成故障(refreshObject:mergeChanges以及文档中的其他几种方法:http: //developer.apple.com/library/mac/documentation/ Cocoa/Conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/TP40003468-SW4)。它还明确告诉你不要覆盖 dealloc,所以我会说你在做正确的事情。不过,很想听听有关该主题的其他想法。

于 2011-09-21T17:39:48.053 回答