我是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指针会引发例外。