10

我有一些 Core Data 功能可以正常工作,直到最近进行了一些(看似无关的)更改。现在我遇到了属于特定 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 无关,但是我对正在发生的事情有点茫然。任何建议将不胜感激。

4

3 回答 3

15

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

在 ARC 下,确保将上下文存储在一个strong变量中,即一个不是全局变量的实例weak变量static

非 ARC,即保留发布代码,请确保您保留了上下文。

于 2011-12-28T15:35:11.387 回答
2

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

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

于 2018-07-25T11:31:59.963 回答
0

检查 viewDidLoad-Method

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

希望这有效

于 2011-11-01T13:09:00.490 回答