【问题标题】:CoreData and NSInvalidArgumentException unrecognized selector sent to instanceCoreData 和 NSInvalidArgumentException 无法识别的选择器发送到实例
【发布时间】:2012-02-21 20:04:45
【问题描述】:

我在尝试设置我的属性“phoneNumber”时一直遇到此异常:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“- [SearchResult setPhoneNumber:]: unrecognized selector sent to instance 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 不再抛出这个异常。不过,我不太了解问题的原因,因为我尝试了几次干净的构建都无济于事......

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


【解决方案1】:

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

如果您想使用 CoreData,您必须使用 NSManagedObject 指定的初始化程序,如NSManagedObject 的类参考文档中所述

NSManagedObject 是一个通用类,它实现了所有基本的 核心数据模型对象所需的行为。这是不可能的 使用 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 是否有某种问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 2012-07-16
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2015-08-02
    相关资源
    最近更新 更多