2013-06-20 41 views
0
#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 


@interface Employee : NSManagedObject 

@property (nonatomic, retain) NSString* name; 
@property (nonatomic, retain) NSNumber* pin; 

-(id) initWithName:(NSString*)name Pin:(NSNumber*)pin; 

@end 


@implementation Employee 

@dynamic name; 
@dynamic pin; 

-(id) initWithName:(NSString*)iname Pin:(NSNumber*)ipin{ 
    self = [super init]; 
    if(self){ 
     name = iname; 
     pin = ipin; 
    } 
    return self; 
} 
@end 

編譯器說名稱和pin在.m文件中未聲明。我究竟做錯了什麼? 把self.nameself.pin工程,但有人可以告訴如果這是正確的或爲什麼這個工程?等等。 非常感謝您的幫助。爲什麼編譯器認爲這個變量是未聲明的?

+0

綜合屬性的正確方法是:@synthesize pin = _pin; – zambrey

+0

@zambrey他的超類是「NSManagedObject」。如果'name'和'pin'是在他的Core Data模型中定義的實體屬性,他應該使用'@ dynamic',而不是'@ synthesize'。 –

+0

@robmayoff感謝您的糾正。不知道這一點。 – zambrey

回答

4

你在你的初始化寫了這個:

name = iname; 

既然你沒有命名name一個局部變量,編譯器查找名爲name的實例變量,或命名name靜態或全局變量。您沒有名爲name的實例變量,也沒有靜態或全局變量。你有一個名爲name的房屋。要設置的屬性,你需要要麼使用「點號」:

self.name = iname; 

,或者您需要發送setName:消息:

[self setName:iname]; 

這兩種編譯完全相同的代碼。

注意,因爲超類是NSManagedObject,我認爲Employee是在你的核心數據模型定義的屬性namepin的實體。如果是這樣,使用@dynamic是正確的。如果這些屬性不是在您的模型中定義的屬性,那麼您應該使用@synthesize(或省略@dynamic@synthesize並讓編譯器自動合成屬性)。

+0

哦,我明白了。我的印象是綜合屬性自動生成變量。必須在我的書中錯誤地閱讀一些內容。非常感謝你搶劫。 –

+0

你不合成這些屬性。你聲明它們是動態的。如果它們是在覈心數據模型中定義的實體屬性,則聲明它們是動態的。我認爲它們是實體屬性,因爲你的超類是NSManagedObject。 –

+1

@ByronS:請注意,根據[NSManagedObject文檔](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html),託管對象必須使用指定的初始化程序('initWithEntity:insertIntoManagedObjectContext:')進行初始化。 –

相關問題