XCode:发送到实例的无法识别的选择器

时间:2012-05-06 20:44:18

标签: objective-c xcode debugging selector

我收到以下错误:

“ - [订单商品]:无法识别的选择器发送到实例0x6b5f240”

我有一个名为Order的类,如下所示:

Order.h

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

@class OrderItem;

@interface Order : NSManagedObject {
@private
}
@property (nonatomic, retain) NSNumber * orderID;
@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) NSNumber * orderCode;
@property (nonatomic, retain) NSSet* items;

@end

Order.m

#import "Order.h"
#import "OrderItem.h"


@implementation Order
@dynamic orderID;
@dynamic date;
@dynamic orderCode;
@dynamic items;

...

如果我正确阅读它,它不会扩展任何具有“项目”方法的类吗?

还有其他原因我会遇到这样的错误。为了增加这种疯狂,这个项目直接从以前的项目中复制,并进行了一些小的编辑。我已经对两个项目中的每个班级进行了文本比较,除了我所做的外观变化之外没有其他区别。

1 个答案:

答案 0 :(得分:6)

@dynamic items告诉编译器您将为items提供方法。

由于这在以前的项目中有效,因此必须在.m文件中的某处使用以下方法:

- (NSSet *)items {
    // Appropriate code
}

如果您不想提供这样的自定义getter,请将@dynamic items更改为@synthesize items,编译器将为您生成一个。

有关详细信息,请参阅Apple提供的 Objective-C编程语言声明的属性部分:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

修改
虽然上面的所有内容仍然适用于普通对象(并且可能仍适用于此处),但我只是注意到这是NSManagedObject的子类。

在您的旧数据模型中,可能存在一个名为items的关系,因此NSManagedObject提供了适当的方法,@dynamic适合防止编译器警告。

如果在您的新数据模型中没有名为items的关系,则不会生成方法,这将导致您遇到的问题。