2010-08-07 36 views
1

我正在潛入iOS開發領域,並且有一些關於操縱我在Xcode中創建的簡單核心數據對象的問題。使用對象編輯器後,下面的Xcode中我生成的類...操作一個簡單的核心數據對象時發生崩潰

@interface Alarm : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSNumber * Enabled; 
@property (nonatomic, retain) NSString * Label; 
@property (nonatomic, retain) NSNumber * Snooze; 

@end 

@implementation Alarm 

@dynamic Enabled; 
@dynamic Label; 
@dynamic Snooze; 

@end 

這裏剪斷,我試圖創建一個Alarm對象,我計劃添加到我的ManagedObjectContext代碼...

- (void)saveAlarm:(id)sender { 

    Alarm *alarm = [[Alarm alloc] init]; 

    alarm.Label = [NSString stringWithString:txtLabel.text];  
    alarm.Snooze = [NSNumber numberWithBool:switchSnooze.on]; 
    alarm.Enabled = [NSNumber numberWithBool:YES]; 

    [addAlarmDelegate insertNewAlarm:alarm]; 
    [alarm release]; 
} 

我的代碼崩潰,我第一次嘗試一個值分配給報警的屬性之一,就行了...

alarm.Label = [NSString stringWithString:txtLabel.text]; 

在以下墜毀的消息控制檯...

reason: '-[Alarm setLabel:]: unrecognized selector sent to instance 0x5e33640 

我在這裏錯過了什麼?

非常感謝您的幫助!

+0

作爲一般的風格點,我會避免資產化您的屬性... – jtbandes 2010-08-07 03:51:20

+0

xcode在生成它們時將它們大寫,而不是我 – BeachRunnerFred 2010-08-07 12:49:32

+1

Xcode將它們大寫,因爲您在我懷疑的實體中有大寫字母。你應該避免這一點。 – 2010-08-07 16:14:02

回答

2

您不應該直接分配和初始化一個基於NSManagedObject的對象。你應該使用

[NSEntityDescription insertNewObjectForEntityForName:@"Alarm" inManagedObjectContext:moc]; 

這可能是它不起作用的原因。因爲它通常非常簡單直接。

文檔說:

如果直接實例化管理對象 ,你必須調用指定 初始化 (initWithEntity:insertIntoManagedObjectContext :)。

而且在initWithEntity:insertIntoManagedObjectContext:的文檔:

重要提示:此方法是 NSManagedObject的 指定的初始化。你不能 簡單地通過 初始化一個被管理的對象發送init。

+0

您應該實際使用'+ [NSEntityDescription insertEntityForName:inManagedObjectContext:]'。沒有必要直接使用'-init ...'方法。 – 2010-08-07 16:14:50

4

我會考慮使用mogenerator:

http://rentzsch.github.com/mogenerator/

的命令行運行它:

mogenerator -m MyAwesomeApp.xcdatamodel -O Classes 

無論目錄,你-O後放是在生產類去。重要的是,在上下文中創建新的管理對象有更簡單的方法,並且還會生成一個您可以自定義的類(添加您自己的方法),即使從模型中重新生成對象也不會被刪除。

比使用XCode對象生成要簡單得多。

+2

將此標記爲垃圾郵件的人不知道mogenerator的作用。這是與核心數據實體相對應的自動生成代碼的完全相關的建議。 – 2010-08-07 19:05:34