【问题标题】:Unrecognized selector for NSManagedObject base classNSManagedObject 基类无法识别的选择器
【发布时间】:2012-07-05 13:01:26
【问题描述】:

在实例上调用基类方法时出现“无法识别的选择器”异常并且看不到问题所在。

我有一个名为 Form 的对象,如下所示:

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

@interface Form : HPSDbBase

@end

Form 的基类如下所示:

#import <CoreData/CoreData.h>

@interface HPSDbBase : NSManagedObject

@property (nonatomic, retain) NSString * id;
@property (nonatomic, retain) NSString * json;

-(id)getJSONElement:(NSString*)key;

@end

然后我尝试在视图控制器方法中使用 Form 对象,如下所示:

HPSAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];

NSError* error = nil;
NSFetchRequest * request = [[NSFetchRequest alloc] init];

[request setEntity:[NSEntityDescription entityForName:@"Form" inManagedObjectContext:appDelegate.managedObjectContext]];

NSArray* arrayOfForms = [appDelegate.managedObjectContext executeFetchRequest:request error:&error];

for (int i=0;i<arrayOfForms.count;i++)
{

    Form* dbForm = [arrayOfForms objectAtIndex:i];

    NSLog(@"Form.json=%@",dbForm.json); // this works

    NSString* wwwww = (Form*)[dbForm getJSONElement:@"test"]; // exception here

}

例外是:

-[NSManagedObject getJSONElement:]: unrecognized selector sent to instance 0x8290940

谁能看出我做错了什么?

谢谢一百万!

编辑 1

这是 HPSDbBase 的实现:

#import "HPSDbBase.h"

@implementation HPSDbBase

@dynamic id;
@dynamic json;


-(id)getJSONElement:(NSString*)key
{
    NSData *jsonData = [[self json] dataUsingEncoding:NSUTF8StringEncoding];

    NSError *e = nil;

    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e];
    NSDictionary *jsonDictionary = (NSDictionary *)jsonObject;

    id rc = [jsonDictionary objectForKey:key];

    return rc;
}

@end 

【问题讨论】:

  • 我们可以看到实现细节吗? getJSONElement 是什么?
  • 我添加了 HPSDbBase 的实现,但我认为问题在于它不是将对象“视为”表单对象,而是将其“视为”为 NSManagedObject 对象?

标签: objective-c core-data inheritance


【解决方案1】:

我找到了问题。

我已重命名我的核心数据对象。我重命名了我能看到的关于核心数据对象名称的所有内容,但这显然还不够。我删除了 core-data 实体,然后用正确的名称重新创建了一个全新的实体,一切都开始工作了。

【讨论】:

  • 感谢您的回复。尽可能将其标记为已回答。干杯。
【解决方案2】:

我在重命名课程后也收到此错误。

如果您不想删除您的类,我发现我可以通过打开我的“xcdatamodeld”文件并单击配置 -> 默认来解决该错误。在那里,实体的类描述仍然引用旧名称。在这里更正后,问题就解决了。

【讨论】:

  • 出于某种原因,在我的情况下,其中一个实体根本没有设置类名。先生,非常感谢您让我走上正轨:)
【解决方案3】:

我也收到了这个错误。结果发现,只是实体的核心数据配置中的属性名称有错别字。它在类实现的@dynamic 语句中被正确命名,因此在编译时没有引发标志,但在访问时立即出现。因为我正在设置 NSManagedObject 子实体,所以我分心于寻找显而易见的东西。只是在这里列出,以防其他人在同一条船上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多