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



我是Objective-C的新手,但是编码多年。不知何故,我对Objective-C不感到温暖。我搜索了Google和Stackoverflow,但我认为我的问题只是简单而愚蠢,还没有人问过。

我的代码基于dateSelectionTitles示例。http://developer.apple.com/library/ios/#samplecode/datesectiontitles/introduction/introduction/intro.html

我有一个nsmanagedObject

@interface Event : NSManagedObject
@property (nonatomic, retain) NSDate * date;
...
// Cache
@property (nonatomic, retain) NSString * primitiveSectionIdentifier;

所有prperties均在我的datamodel中定义

但是当我打电话

NSString *tmp = [self primitiveSectionIdentifier];

我得到异常

终止由于未被发现的例外" nsinvalidargumentException",原因:' - [event pripitivesectiveIdentifier]:未识别的选择器发送到实例0x74850c0'

简单地说:

Event *foo = [[Event alloc] init];
if (foo.primitiveSectionIdentifier) {
    NSLog(@"YEAH");
}

引发相同的例外。因此,我基本上想检查primitivesectionIdentiendifier是否为零。但是,当我访问该属性时,它会引发异常吗?我是否需要在每个属性中进行分配,然后才能检查它是否具有价值?!

我不到这里的objective-c基础知识?

非常感谢您的回复!

没有编译器警告只有一种方法可以发生这种情况 - 您必须在实现文件中写入@dynamic primitiveSectionIdentifier;。这意味着您不想定义该方法,因为您相信它已经定义了其他地方。

您正在使用NSManagedObject,您知道它是如何工作的吗?您声明没有实施的方法(将@dynamic放入实现中),当调用该方法时,找不到它,而是调用特殊处理程序[NSObject doesNotRecognizeSelector:]。该处理程序检查核心数据模型是否存在给定选择器的属性,如果不存在,则会引发您看到的异常。

因此,问题可能是由于您的模型中未声明primitiveSectionIdentifier而引起的。

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

尝试

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

如果它没有为您提供所需的字符串,那么问题可能是因为字符串对象从未初始化,并且仍设置为零。在这种情况下,代码将编译,但是将选择器发送到nil指针会引发例外。

相关内容

最新更新