Objective-C属性访问:发送到实例的无法识别的选择器

时间:2012-11-01 17:18:22

标签: iphone objective-c ios

我是objective-c的新手,但现在编码很多年了。不知怎的,我没有得到Objective-C的温暖。我搜索了谷歌和stackoverflow,但我认为我的问题只是简单而愚蠢,没有人问过这个问题。

我的代码基于DateSelectionTitles示例。 http://developer.apple.com/library/ios/#samplecode/DateSectionTitles/Introduction/Intro.html

我有一个NSManagedObject

@interface Event : NSManagedObject

@property (nonatomic, retain) NSDate * date;
...

// Cache
@property (nonatomic, retain) NSString * primitiveSectionIdentifier;

所有属性都在我的数据模型中定义,但primitiveSectionIdentifier除外(如苹果示例中所示)

但是当我打电话时

NSString *tmp = [self primitiveSectionIdentifier];

我得到了例外

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [event primitiveSectionIdentifier]:无法识别的选择器发送到实例0x74850c0'

说实话:

Event *foo = [[Event alloc] init];

if (foo.primitiveSectionIdentifier) {
    NSLog(@"YEAH");
}

抛出相同的异常。所以我基本上想检查primitiveSectionIdentifier是否为nil。但是当我访问该属性时,它会引发异常?在检查它是否有值之前,是否需要分配每个属性?!

我没有到达哪个Objective-C基础?

非常感谢您的回复!

2 个答案:

答案 0 :(得分:1)

您正在使用较旧的示例程序,该程序使用不同风格的内存管理;如果您在iOS 5或6下进行编译,可能会导致问题。

尝试

NSLog(@"primitiveSectionIdentifier = %@", self.primitiveSectionIdentifier);

如果它没有给你你正在寻找的字符串,那么问题很可能是字符串对象从未被初始化并且仍然设置为nil。在那种情况下,代码会编译,但是将选择器发送到nil指针会引发异常。

答案 1 :(得分:1)

如果没有编译器警告,只有一种方法可以实现 - 您必须在实现文件中编写@dynamic primitiveSectionIdentifier;。这意味着您不希望定义该方法,因为您认为该方法已在其他位置定义。

您使用的是NSManagedObject,您知道它是如何工作的吗?您声明方法没有实现(在实现中放置@dynamic),并且在调用方法时,找不到它,而是调用特殊的处理程序[NSObject doesNotRecognizeSelector:]。此处理程序检查Core Data模型是否存在给定选择器的属性,如果不存在,则会抛出您看到的异常。

因此,问题可能是由于模型中未声明primitiveSectionIdentifier这一事实造成的。