Objective c NSManagedObject密钥存在于实体描述中,但当尝试访问它时,应用程序会崩溃,并显示“0”;此类不符合键值编码要求”;

Objective c NSManagedObject密钥存在于实体描述中,但当尝试访问它时,应用程序会崩溃,并显示“0”;此类不符合键值编码要求”;,objective-c,ios,cocoa-touch,core-data,Objective C,Ios,Cocoa Touch,Core Data,我有一个NSManangedObject,它显示实体描述中所有正确的属性。但每当我试图访问其中一个属性时,它就会崩溃,说它不符合键值编码 我已经三次检查了我的数据模型和实体类,一切看起来都是正确的 我不确定这是否有区别,但我是通过通知访问对象的。以下是一个例子: NSDictionary *dict = notification.userInfo; NSSet *set = [dict objectForKey:NSInsertedObjectsKey]; for (NSManagedObje

我有一个NSManangedObject,它显示实体描述中所有正确的属性。但每当我试图访问其中一个属性时,它就会崩溃,说它不符合键值编码

我已经三次检查了我的数据模型和实体类,一切看起来都是正确的

我不确定这是否有区别,但我是通过通知访问对象的。以下是一个例子:

NSDictionary *dict = notification.userInfo;
NSSet *set = [dict objectForKey:NSInsertedObjectsKey];

for (NSManagedObject* managedObject in set) {
    NSLog(@"%@", managedObject.entity.attributesByName);
    if([managedObject.entity.attributesByName valueForKey:@"defaultid"] != nil) {
        NSLog(@"defaultid: %@", [managedObject valueForKey:@"defaultid"]);
    }
}
将输出:

{
    defaultid = "(<NSAttributeDescription: 0x175c90>), name defaultid, isOptional 1, isTransient 0, entity MyEntity, renamingIdentifier defaultid, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 100 , attributeValueClassName NSNumber, defaultValue 0";
    title = "(<NSAttributeDescription: 0x175ce0>), name title, isOptional 1, isTransient 0, entity MyEntity, renamingIdentifier title, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 700 , attributeValueClassName NSString, defaultValue (null)";
}
上面的代码在mergeiCloudChanges方法中

编辑2(已解决):

结果我犯了一个愚蠢的错误。我认为[dict objectForKey:NSInsertedObjectsKey]返回了一组managedObjects,但它所做的是返回一组managedObjects

这项工作:

NSDictionary *dict = note.userInfo;
NSSet *set = [dict objectForKey:NSInsertedObjectsKey];
for (NSManagedObjectID* managedObjectID in set) {
    NSManagedObject *newObject = [moc existingObjectWithID:managedObjectID error:nil];
}

感谢大家抽出时间。

从实体描述中可以看出,您已将defaultid标记为可选。您正在访问的实体是否存在?如果关闭“可选”并为其提供默认值,会发生什么情况?

谢谢,但“可选”不应使其崩溃。如果defaultid没有值,则对象将返回nil。几乎我的应用程序中的每个字段都是可选的,但在其他任何地方仍然返回nil。导致崩溃的代码行是什么?正是这一位导致了实际崩溃:[managedObject valueForKey:@“defaultid”]我觉得您的代码很好,在我的安装程序中运行时没有任何异常。您正在订阅哪个通知?是否涉及任何线程?这是一个icloud coredata同步通知。有一些线程。我会将代码添加到问题中。我不确定自您提出此问题以来是否发生了更改,但我在NSSet for
NSInsertedObjectsKey
中看到了实际的NSManagedObject实例。在我的例子中,它是用于
nsmanagedobjectcontextdidsaveinnotification
通知的。我想我会发布这篇文章,以防有人看到这篇文章并假设它们是NSManagedObjectID对象(正如我所做的:-P)。
- (void)mergeChangesFrom_iCloud:(NSNotification *)notification {
    NSManagedObjectContext* moc = [self managedObjectContext];
    [moc performBlock:^{
        [self mergeiCloudChanges:notification forContext:moc];
    }];
}
NSDictionary *dict = note.userInfo;
NSSet *set = [dict objectForKey:NSInsertedObjectsKey];
for (NSManagedObjectID* managedObjectID in set) {
    NSManagedObject *newObject = [moc existingObjectWithID:managedObjectID error:nil];
}