2012-11-01 29 views
2

我是Objective-C的新手,但现在编码已经很多年了。不知何故,我对Objective-C不感兴趣。我搜索谷歌和stackoverflow,但我认为我的问题只是简单和愚蠢的,没有人问过这个呢。Objective-C属性访问:发送到实例的无法识别的选择器

我的代码基于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]; 

我获得例外

Termina由于未捕获的异常 'NSInvalidArgumentException',原因婷应用: ' - [事件primitiveSectionIdentifier]:无法识别的选择发送到实例0x74850c0'

说得简单:

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

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

抛出同样的异常。所以我基本上想检查primitiveSectionIdentifier是否为零。但是当我访问属性时,它会抛出异常?在我能检查它的价值之前,我是否需要分配每个属性?

哪个Objective-C基础知识我不在这里?

非常感谢回复!

+5

你在'@ implementation'部分编写了'@synthesize primitiveSectionIdentifier;'吗? – 2012-11-01 17:19:53

+2

您的代码编译时是否没有警告? – rmaddy

+0

如果您使用的是Xcode 4。5编译器不会给出不合成警告(@synthesize属性)。改为尝试使用self.primitiveSectionIdentifier。在Xcode 4.5发布说明中提到https://developer.apple.com/library/mac/#releasenotes/DeveloperTools/RN-Xcode/_index.html –

回答

1

只有一种方式会发生些什么没有编译器警告 - 您必须在实现文件已经写@dynamic primitiveSectionIdentifier;。这意味着你不想定义方法,因为你相信它已经在其他地方定义了。

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

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

+0

谢谢你,这个伎俩。我用合成primitiveSectionIdentifier;它的工作。我认为在XCode 4中,综合是自动完成的。显然,如果属性设置为动态的话。 – user1792043

+0

这正是我的情况,但问题属性实际上是在我的模型中声明的。我能做什么? –

+0

@Sulthan:谢谢你的洞察力。但是,就我而言,要访问的属性是在我的模型中定义的,但我没有将任何数据存储在属性中。我正在使用iOS 9.2。 – moonman239

1

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

尝试

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

如果它不给你你正在寻找则该字符串的问题很可能在该字符串对象是从未初始化,仍设置为零。在这种情况下,代码会编译,但是向nil指针发送选择器会引发异常。

+0

将选择器发送到'nil'永远不会抛出异常。这也与内存管理无关。 MRC仍然有效且被广泛使用。 – Sulthan

相关问题