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

Posted

技术标签:

【中文标题】[NSManagedObject sayHello]:无法识别的选择器发送到实例 0x【英文标题】:[NSManagedObject sayHello]: unrecognized selector sent to instance 0x 【发布时间】:2013-07-09 10:01:50 【问题描述】:

我尝试扩展 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

我可以取出所有我的盒子

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

有效

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

【问题讨论】:

您可能忘记在 coredata 编辑器中将实体的类设置为 MyBox 我在 coredata 编辑器中设置了 Entity->Name = Entity->Class = "MyBox"。我必须设置一些其他属性吗? 嗯,这很奇怪。不,这应该足够了......你可能有多个版本吗? 我同意阿拉丁的观点。如果实体类设置为 MyBox,那么这应该可以工作。但错误消息明确指出myBoxonly NSManagedObject。也许在获取并检查类之后直接 NSLog myBoxes 数组。 调用[myBox sayHello]方法的类与Core Data类是否在同一个项目中? 【参考方案1】:

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

【讨论】:

妈的,我总是忘记这件事。 我使用 Xcode 8 目标 c 编辑器->创建 NSManagedSubclass 并在配置中它在我所有实体的前面都有句点,这导致了同样的问题,但重命名它们使其匹配自动生成的代码修复它.【参考方案2】:

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

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

【讨论】:

【参考方案3】:

对于 Swift 5.0

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

Xcdatamodel 错误。

我有错误的 xcdatamodel。这是一个超级愚蠢的错误,但是当您假设最新的模型是 27 但您的同事将其更改为 28 并且您将属性添加到模型 27 时,它会发生。您遇到此类错误并且您认为这是您的核心数据模型有问题但这只是您的 xcdatamodel 编号。

一定要热爱编程 =_=。

【讨论】:

以上是关于[NSManagedObject sayHello]:无法识别的选择器发送到实例 0x的主要内容,如果未能解决你的问题,请参考以下文章

“NSManagedObject”类的 NSManagedObject 必须具有有效的 NSEntityDescription

NSManagedObject 故障/无法获得由 NSManagedObject 处理的“原始”对象

NSManagedObject - NSSet 被删除?

如何根据现有的 NSManagedObject 值在 NSManagedObject 派生类中设置默认值?

属性作为“当前 NSManagedObject”的视图控制器中的 NSManagedObject

创建新的 NSManagedObject 并将其分配给新的 NSManagedObject *有时*会失败