[NSManagedObject sayHello]:无法识别的选择器发送到实例0x

时间:2013-07-09 10:01:51

标签: objective-c core-data nsmanagedobject

我尝试扩展NSManagedObject。 使用XCode我创建了MyBox.m和MyBox.h(直接来自xcdatamodel文件)。

然后我修改了这些文件:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface MyBox : NSManagedObject

@property (nonatomic, retain) NSDate * endDate;
@property (nonatomic, retain) NSNumber * globalId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSDate * startDate;

-(NSString *)sayHello;

@end

#import "MyBox.h"
@implementation MyBox

@dynamic endDate;
@dynamic globalId;
@dynamic name;
@dynamic startDate;

-(NSString *)sayHello {
    return @"hello";
}  

@end

我可以获取所有myBoxes

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"MyBox" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

NSMutableArray *myBoxes = [context executeFetchRequest:fetchRequest error:&error];

但后来我打电话给

MyBox *myBox = [myBoxes objectAtIndex:indexPath.row];    
    [myBox sayHello];

它编译然后我得到

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject sayHello]: unrecognized selector sent to instance 0x8e73fc0'

如果我只读取像

这样的值
NSLog(@"%@", myBox.name);

它有效

我在这里发现了类似的问题,但没有解决方案。 谢谢你的帮助。

5 个答案:

答案 0 :(得分:20)

我刚刚遇到同样的问题。通过在myApp.xcdatamodeld -> configurations -> default -> entities -> myEntity中将类名更改为我的NSManagedObject子类的名称来解决它。

答案 1 :(得分:4)

假设您已在MyBox实体上正确设置了类名,我猜该应用程序具有较旧版本的Core Data托管对象模型。清理您的构建并删除模拟器/设备上的应用程序以获得良好的衡量标准。要100%确定,还要删除派生数据文件夹。

如果之后不起作用,我敢打赌你没有正确设置实体类名。打印出您的NSEntityDescription并确保它符合您的期望。

答案 2 :(得分:0)

我在xcdatamodeld中设置了正确的类名,但我没有在目标中包含类的.m文件。我必须单击左侧边栏上的.m,然后选中目标成员资格下右侧边栏上的正确框。

答案 3 :(得分:0)

错误的Xcdatamodel。

我的xcdatamodel错误。这是一个非常愚蠢的错误,但是当您假设最新的模型是27,但您的同事将其更改为28,然后将属性添加到模型27时,就会发生这种错误。您会认为核心数据模型有问题。但这只是您的xcdatamodel号。

必须爱编程= _ =。

答案 4 :(得分:0)

对于Swift 5.0

以这种方式创建CoreData对象时,会出现此问题:

let object = CoreDataClass()
print(object.someProperty) // this is emit crash