CoreData和NSInvalidArgumentException:未识别的选择器发送到实例

4

当我试图设置我的“phoneNumber”属性时,总是遇到这个异常:

* 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因是:“- [SearchResult setPhoneNumber:]:向实例0x256b40发送了无法识别的选择器”

这里是具有phoneNumber属性的类:

@interface SearchResult : NSManagedObject
@property (nonatomic, retain) NSString * phoneNumber;
@end

@implementation SearchResult
@dynamic phoneNumber;
@end

问题在于当我执行以下操作:

SearchResult *managedObject = [self findExistingSearchResultById:restaurantId];

if(managedObject == nil)
{ 
    managedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SearchResult" inManagedObjectContext:managedObjectContext];
}

// Exception throws here.
managedObject.phoneNumber = @"1234567890";

这是 findExistingSearchResult 方法:

+ (SearchResult *)findExistingSearchResultById:(NSString *)restaurantId
{
    NSManagedObjectContext *managedObjectContext = serviceContext;
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"SearchResult" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"restaurantId = %@", restaurantId];
    [request setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:request error:&error];
    if(fetchedObjects != nil)
    {
        return [fetchedObjects lastObject];
    }
    else
    {
        return nil;
    }
}

我在我的应用程序中使用非常相似的类实现,并且没有遇到像这样的任何问题。我还没有弄清楚为什么在这里设置phoneNumber属性会抛出此异常。


谢谢大家的回答。虽然我换了电脑,问题就消失了。我检查了我的最新代码,并在另一台机器上获取了最新版本,Xcode不再抛出这个异常。但我还是不太明白问题的原因,因为我已经尝试过几次清理构建,但都没有效果... - mservidio
2个回答

7
问题在于你正在尝试使用NSObject的传统alloc / init方法来实例化NSManagedObject
如果您想使用CoreData,必须使用NSManagedObject指定的初始化程序,如NSManagedObject类参考文档中所述。
NSManagedObject是一个通用类,实现了Core Data模型对象所需的所有基本行为。不可能使用NSObject的直接子类(或任何其他未继承自NSManagedObject的类)的实例与托管对象上下文一起使用。您可以创建NSManagedObject的自定义子类,但这并不总是必需的。如果不需要自定义逻辑,则可以使用NSManagedObject实例形成完整的对象图。
托管对象与实体描述(NSEntityDescription的实例)相关联,提供关于对象的元数据(包括对象表示的实体的名称及其属性和关系的名称)以及跟踪对象图的托管对象上下文。重要的是,必须正确配置托管对象以便与Core Data一起使用。如果直接实例化托管对象,则必须调用指定的初始化程序(initWithEntity:insertIntoManagedObjectContext:)。
来源: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html

抱歉,我没有包含创建问题的所有代码,你的答案在原始代码的基础上肯定是正确的。我刚刚更新了代码以展示我正在做什么。我刚刚检查了我的所有代码,并在我的另一台电脑上用Xcode打开了我的项目,问题似乎已经解决了。我尝试了多次进行清理构建,不知道是不是Xcode有某种问题。 - mservidio

2

我曾经遇到同样的问题,但无法解决。最终我从xcdatamodel文件中删除了该属性,然后重新添加并进行了清理和重建。在许多其他尝试失败后,最终成功了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接