我有一些核心数据功能正常工作,直到最近(看似无关)一些更改。现在我遇到的问题是属于特定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无关,但是对于发生的事情我有点不知所措。任何建议都将非常感谢。
答案 0 :(得分:11)
这很可能是因为这些对象所属的NSManagedObjectContext
正在消失。如果您有NSManagedObject
个实例但是您没有自己保留上下文,那么这些托管对象将开始返回nil
。
在ARC下,请确保将上下文存储在strong
变量中,即不是weak
或static
全局的实例变量。
非ARC,即保留释放代码,请确保您保留上下文。
答案 1 :(得分:1)
正如其他人提到的(也是我的情况),请确保您没有reset
受管对象上下文,因为如果这样做,则所有存储为属性的实体都将具有data: <fault>
。
如果您执行reset
受管对象上下文,则还必须重新获取实体本身。
答案 2 :(得分:0)
检查viewDidLoad-Method
profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext];
希望这有效