初始 CoreData 对象的类型错误。

Posted

技术标签:

【中文标题】初始 CoreData 对象的类型错误。【英文标题】:Initial CoreData object is of the wrong type. 【发布时间】:2012-02-10 19:23:21 【问题描述】:

创建一个初始对象,将其插入到 ManagedObjectContext 中,并保存上下文。然后将此对象设置为管理 CoreData 堆栈的单例类的属性。

这个原始对象,当从另一个类引用时,是错误的类型(NSCFString)。另一方面,如果对象被获取,那么它就是正确的类并且可以正常工作。

NSArray *pdaSetupRecords = [results fetchedObjects];
//If this is the initial launch of the application, create 
//a PDASetup object and save the context, otherwise set 
//pdaSetup to the fetched instance. 
if ([pdaSetupRecords count] < 1) 
    PDASetup *newPdaSetup = (PDASetup *) [NSEntityDescription insertNewObjectForEntityForName:@"PDASetup" inManagedObjectContext:managedObjectContext];
    [self saveContext];
    pdaSetup = newPdaSetup;
    NSLog(@"SystemUtility - PDASetup object created and saved.");
 else 
    pdaSetup = [pdaSetupRecords objectAtIndex:0];

如您所见,将只有一个 PDASetup 对象。在创建 PDASetup 对象时会出现此问题。如果我重新运行应用程序并获取 PDASetup 对象,一切都很好。

有什么想法吗?

【问题讨论】:

【参考方案1】:

你的意思是写:

pdaSetup = [newPdaSetup retain];

self.pdaSetup = newPdaSetup; //with a retained @property

您的应用程序是否崩溃并告诉您类型是 NSCFString?可能内存地址被字符串覆盖了。

【讨论】:

你是对的,设置 self.pdaSetup 纠正了问题,其他建议也是如此。我没有意识到设置 self.* 会有所作为。 我喜欢当我从猜测中正确的时候......你需要再次阅读内存管理规则并使用@properties。 self.* 调用变量的属性访问器/修改器,如果您在属性上使用“保留”,则保留该变量。或者...开始使用 ARC。 不确定我的问题是否可以通过重新阅读内存管理规则来解决,我只是没有意识到不调用综合会导致未保留的值。当我阅读您的答案时,我基本上跳到了 2 个版本的定义,看到一个转到了头文件!

以上是关于初始 CoreData 对象的类型错误。的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 中看似有效的对象出现“悬空引用无效对象”错误

Core Data 无法删除从未插入的对象错误

在 iOS 中对来自 Core Data 的实体的 NSArray 进行快速枚举时出现运行时错误

RestKit 对象映射 POST 响应,“CoreData:错误:在 NSManagedObject 类映射操作上调用指定初始化程序失败”

在 Core Data 中,NSManaged 对象上的 URI 属性类型应该用于啥?

如何在 Core Data 中为多个对象(相同实体类型)生成数组实例?