核心数据属性更改为nil(ARC相关?)

时间:2011-08-26 01:27:17

标签: objective-c core-data automatic-ref-counting

我有一些核心数据功能正常工作,直到最近(看似无关)一些更改。现在我遇到的问题是属于特定NSManagedObject子类实例的所有属性突然返回nil。

假设我的NSManagedObject子类名为Foo,它只有一个名为value的属性。一旦我意识到价值在某种程度上变为零,我去设置以下类别来监控价值的变化。

@implementation Foo (Debug)

- (void)setValue:(NSDate *)value
{
    [self willChangeValueForKey:@"value"];
    [self setPrimitiveValue:value forKey:@"value"];     
    [self didChangeValueForKey:@"value"];
}

- (NSDate *)value
{
    [self willAccessValueForKey:@"value"];
    NSDate *value = [self primitiveValueForKey:@"value"];
    [self didAccessValueForKey:@"value"];

    return value;
}

@end

setValue:为我的对象调用,传入的参数是一个非零NSDate。然后检索该值(在另一种方法中)。正确检索指定的相同值。

但是当另一个方法尝试读取值时,将调用值访问器并由primitiveValueForKey返回nil值:。

在两个读取之间没有调用setValue:并且Foo对象本身仍然有效(非零)。事实上,在任何Core Data对象或整个上下文的两次读取之间不会执行其他Core Data操作。

我们在项目中使用ARC。有可能ARC在某种程度上搞乱了我的核心数据变量并取消分配它们吗?如果是这样,有人有任何调试ARC解除分配的建议吗?或者更好的是,是否有人知道确保ARC不释放变量的方法。

这甚至可能与ARC无关,但是对于发生的事情我有点不知所措。任何建议都将非常感谢。

3 个答案:

答案 0 :(得分:11)

这很可能是因为这些对象所属的NSManagedObjectContext正在消失。如果您有NSManagedObject个实例但是您没有自己保留上下文,那么这些托管对象将开始返回nil

在ARC下,请确保将上下文存储在strong变量中,即不是weakstatic全局的实例变量。

非ARC,即保留释放代码,请确保您保留上下文。

答案 1 :(得分:1)

正如其他人提到的(也是我的情况),请确保您没有reset受管对象上下文,因为如果这样做,则所有存储为属性的实体都将具有data: <fault>

如果您执行reset受管对象上下文,则还必须重新获取实体本身。

答案 2 :(得分:0)

检查viewDidLoad-Method

profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext];

希望这有效