我有一些核心数据功能,在最近进行了一些(看似无关的)更改之前一直运行良好。现在我遇到了属于特定 NSManagedObject 子类实例的所有属性突然返回 nil 的问题。
假设我的 NSManagedObject 子类称为 Foo,它只有一个名为值的属性。一旦我意识到值(value)不知何故变成了零,我就去设置以下类别来监控值(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 无关,但我对发生的事情有点不知所措。任何建议将不胜感激。
最佳答案
这很可能是因为这些对象所属的 NSManagedObjectContext
正在消失。当你有 NSManagedObject
实例但你自己不持有上下文时,这些托管对象将开始返回 nil
。
在 ARC 下,确保将上下文存储在 strong
变量中,即不是 weak
或 static
全局的实例变量。
非 ARC,即保留释放代码,确保您保留上下文。
关于objective-c - 核心数据属性更改为 nil(与 ARC 相关?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7199143/