我有一个iPhone应用程序有2个模型,类别和内容,它们有多对多的关系.
@interface Content : NSManagedObject { } @property(readwrite,retain) NSString *type; @property(readwrite,retain) NSString *mainText; ... @property (copy) NSSet * categories; @end
类别
@interface Category : NSManagedObject { } @property (nonatomic,retain) NSNumber * id; @property (nonatomic,retain) NSNumber * active; ... @property (copy) NSSet * contents; @end
然后这个操作:
... NSSet *tmp_set = [NSSet setWithArray:some_array_with_contents objectsAtIndexes:custom_indexes]]; cat.contents = tmp_set; [[DataModel managedObjectContext] save:&error]; ...
在最后一行,应用程序严重崩溃说:
-[__NSCFSet _isValidRelationshipDestination__]: unrecognized selector sent to instance 0x5c3bbc0 *** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '-[__NSCFSet _isValidRelationshipDestination__]: unrecognized selector sent to instance 0x5c3bbc0'
解决方法
您的关系属性不应使用副本.他们应该保留,例如:
@property (nonatomic,retain) NSSet* categories;
您不希望复制一组托管对象,因为您最终会在对象图中找到重复的对象.这将导致大问题.
但是,这不是当前的问题.直接的问题是某些东西导致用于托管对象的选择器被发送到集合本身.
最有可能的原因是直接将复制的集合直接分配给关系而不是使用.m文件中定义的访问器方法之一. @dynamic指令不会创建setCategories方法,因为这是一个托管对象,因此您无法获得正确的KVO通知,并且上下文无法正确更新.当它尝试保存时,它会将验证消息发送到设置对象而不是它包含的对象.