CoreData和NSInvalidArgumentException无法识别的选择器发送到实例

时间:2012-01-29 21:22:33

标签: iphone objective-c core-data ios5 nsmanagedobject

在尝试设置我的属性“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属性会抛出此异常。

3 个答案:

答案 0 :(得分:6)

问题是您尝试使用NSManagedObject的传统alloc / init方法实例化NSObject

如果要使用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

答案 1 :(得分:2)

我遇到了同样的问题但无法解决。最后,我从xcdatamodel文件中删除了该属性,然后重新添加,清理和重建。在许多其他事情失败后终于工作了。

答案 2 :(得分:-3)

你把它放在你的界面中:

@property (nonatomic, retain) NSString * phoneNumber;

这意味着您的实施必须提供两种方法,phoneNumbersetPhoneNumber:

你把它放在你的实现中:

@dynamic phoneNumber;

告诉编译器将确保运行时存在phoneNumbersetPhoneNumber:方法,因此编译器不应该警告你没有找到它们。

@dynamic语句替换为:

@synthesize phoneNumber;

告诉编译器为您生成phoneNumbersetPhoneNumber:方法,并生成一个私有实例变量来保存属性的值。