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

10

我试图扩展NSManagedObject。使用XCode,我从xcdatamodel文件直接创建了MyBox.m和MyBox.h文件。

然后我修改了这些文件:

#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

我可以获取所有我的盒子

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);

它起作用了

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


9
您可能忘记在CoreData编辑器中将实体的类设置为 MyBox - Alladinian
1
我已经在coredata编辑器中设置了Entity->Name = Entity->Class = "MyBox"。我还需要设置其他属性吗? - stefanr
嗯,这很奇怪。不,应该足够了... 你可能有多个版本吗? - Alladinian
1
调用[myBox sayHello]方法的类是否与Core Data类在同一个项目中? - ChrisH
我已经对类进行了重命名重构,这导致核心数据编辑器中实体的类字段被清空。 - Geva
显示剩余4条评论
5个回答

21

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


1
该死的,我总是忘记这个东西。 - Rudolf Adamkovič
1
我使用Xcode 8的Objective-C编辑器->创建NSManagedSubclass,在配置中,所有实体前面都有句点,导致了相同的问题,但将它们重命名以匹配自动生成的代码就解决了这个问题。 - Doug Voss

3
假设你已经在 "MyBox" 实体类上正确设置了类名,我猜测你的应用程序可能使用着旧版的 Core Data 托管对象模型。请清除编译并删除模拟器/设备上的应用程序以确保。为 100% 确认,请同时删除生成数据文件夹。
如果这样还不行,我敢打赌你没有正确设置实体类名。输出你的 “NSEntityDescription” 并确保它符合你的期望。

2
Swift 5.0版本说明

当您以以下方式创建CoreData对象时,会出现此问题:

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

0

我在xcdatamodeld中设置了正确的类名,但是我没有将该类的.m文件包含在我的目标中。我需要点击左侧边栏上的.m文件,然后在右侧边栏下的Target Membership中勾选正确的框。


0

错误的 Xcdatamodel。

我使用了错误的 xcdatamodel。这是一个非常愚蠢的错误,当你假设最新的模型是27,但是你的同事将其更改为28并且你将属性添加到模型27时,就会发生这种情况。你会遇到这种错误,并且会认为是你的 Core Data 模型出了问题,但实际上只是你的 xcdatamodel 号码不对。

编程真是太棒了 =_=。


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