NSManagedObject 无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】NSManagedObject 无法识别的选择器发送到实例【英文标题】:NSManagedObject unrecognized selector sent to instance 【发布时间】:2013-08-06 07:06:04 【问题描述】:

我有一个如下的核心数据模型,其中 children 是一对多关系。

.h

@implementation MyEntity

@dynamic name;
@dynamic children;

@end

.m

@interface MyEntity : NSManagedObject

@property (nonatomic) NSString *name;
@property (nonatomic) NSOrderedSet *children;

@end

然后我尝试使用:

        MYAppDelegate *delegate = (MYAppDelegate *)[UIApplication sharedApplication].delegate;
        NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];
        NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext];
        NSManagedObject *newCategory = [[NSManagedObject alloc] initWithEntity:categoryEntity insertIntoManagedObjectContext:managedObjectContext];
        [newCategory setValue:key forKey:@"name"];
        NSOrderedSet *testSet = [[NSOrderedSet alloc] initWithArray:@[@"This", @"is", @"a", @"test"]];
        [newCategory setValue:testSet forKey:@"children"];
    

但在最后一行,我得到了这个错误:

NSCFConstantString managedObjectContext]:发送了无法识别的选择器 到实例 0xe8fa0'

如果我将NSOrderedSet 更改为NSSet,编译器会抱怨它需要NSOrderedSet

如何将集合分配给NSManagedObject

【问题讨论】:

【参考方案1】:

问题不在于NSOrderedSet,而是您放入集合中的NSString 实例。这些需要替换为在关系目的地的数据模型中配置的实体的实例。你不能用错误的对象来填充关系。

【讨论】:

NSManagedObject 代表一个类别。该类别与自身具有一对多关系,因为我使用的是类别的递归层次结构。看来NSOrderedSet 的元素应该是MyEntity 的实例。但是我怎样才能创建那些对象和孩子呢?我是否需要使用首先填充子实体的算法? 因为这是一个测试,只需 alloc] initWithEntity:categoryEntity 一个新的实体实例并将其放入集合中。

以上是关于NSManagedObject 无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 子类 - 发送到实例的无法识别的选择器

发送到实例错误的核心数据无法识别的选择器:并且无法在 NSManagedObject 类上调用指定的初始化程序

swift coredata - 发送到实例的无法识别的选择器

更新核心数据模型后出错 - 无法识别的选择器发送到实例

NSSortDescriptor 和 [__NSCFNumberlocalizedStandardCompare:]:发送到实例的无法识别的选择器

删除 NSManagedObject 时出错 [重复]