2012-11-01 64 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

相關問題