2

我是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;

所有 prperties 都在我的数据模型中定义,除了原语SectionIdentifier(如苹果示例中)

但是当我打电话

NSString *tmp = [self primitiveSectionIdentifier];

我得到了例外

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

简单地说:

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

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

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

我没有学到哪些 Objective-C 基础知识?

非常感谢您的回复!

4

2 回答 2

1

您正在使用一个较旧的示例程序,它使用不同的内存管理方式;如果您在 iOS 5 或 6 下编译,则可能会导致问题。

尝试

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

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

于 2012-11-01T18:08:13.313 回答
1

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

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

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

于 2012-11-01T18:59:51.600 回答