核心数据属性更改为 nil(与 ARC 相关?)
Posted
技术标签:
【中文标题】核心数据属性更改为 nil(与 ARC 相关?)【英文标题】:Core Data attribute changes to nil (ARC related?) 【发布时间】:2011-08-26 01:27:16 【问题描述】:我有一些 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 无关,但是我对正在发生的事情有点茫然。任何建议将不胜感激。
【问题讨论】:
ARC 仍处于保密协议下,因此我们无法在 Apple 受限论坛之外进行讨论。 ARC is not under NDA. 您是否有机会使用对象的两个不同副本处理两个不同的线程?否则,您确定这是完全相同的对象吗?你不做两个吗?或者您没有重置您的上下文或以其他方式丢失您之间的更改? 【参考方案1】:这很可能是因为这些对象所属的NSManagedObjectContext
正在消失。当您周围有 NSManagedObject
实例但您自己没有保留上下文时,这些托管对象将开始返回 nil
。
在 ARC 下,确保将上下文存储在 strong
变量中,即不是 weak
或 static
全局变量的实例变量。
非 ARC,即保留发布代码,请确保您保留上下文。
【讨论】:
有谁知道为什么会这样?我有同样的问题,只能通过使用我自己的 managedObjectContext 变量来解决。但这很烦人,听起来更像是一个错误。 您需要把握上下文。那不是错误。托管对象上下文使大部分 Core Data 工作。如果您没有上下文,则托管对象不知道与什么进行交互。 使用 ivarNSManagedObjectContext *mContext
不会完成这项工作?
您可以将上下文存储到应用委托的实例变量中,是的。
抱歉有点不准确。我在类 A 的接口中声明了 mContext,这是一种 NSManagedObject。但是A类的对象在返回对象后直接失去了它的上下文和分配给mContext的上下文。所有其他属性或属性保持其值。只有上下文消失了。【参考方案2】:
正如其他人提到的(我的情况也是如此),请确保您没有 reset
您的托管对象上下文,因为如果这样做,所有存储为属性的实体都将具有 data: <fault>
。
如果您对托管对象上下文执行reset
,您还必须重新获取实体本身。
【讨论】:
【参考方案3】:检查 viewDidLoad-Method
profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext];
希望这可行
【讨论】:
以上是关于核心数据属性更改为 nil(与 ARC 相关?)的主要内容,如果未能解决你的问题,请参考以下文章
将属性更改为不再是瞬态的 - 我可以通过轻量级核心数据迁移来做到这一点吗?