2012-11-19 17 views
0

當我使用的核心數據,那麼產生的NSManagedObject從它的子類,我得到下面的輸出(在.h)中創建一個實體:添加到高德子類NSManagedObject

@class Foo; 

@interface Foo : NSManagedObject 

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSSet *otherValues; 

@end 

然而,在我的.m文件我想要使​​用nameotherValues值。通常我會簡單地創建幾個ivars,然後根據需要爲它們添加屬性。這樣我就可以輕鬆地在我的.m文件中訪問它們。

在這種情況下可以接受嗎?將添加ivars到.h(對於nameotherValues)導致持久性&檢索對象中的任何異常行爲?

回答

4

您不使用實例變量來訪問核心數據管理對象的屬性。

生成的實現文件包含這意味着對於核心數據的屬性吸氣/ setter函數是動態創建的發言

@dynamic name; 
@dynamic otherValues; 

,例如從託管對象上下文或從基礎持久性存儲檢索值。

所以,你應該始終使用屬性來訪問屬性,例如:在Modeled Properties

Foo *myFoo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo" inManagedObjectContext:context]; 
myFoo.name = @"test"; 

或者,您可以使用鍵值的方法:

[myFoo setValue:@"test" forKey:@"name"]; 

參見「核心數據編程指南」:

核心數據動態生成有效的公共和原始獲取和 設置屬性訪問器方法...在受管理對象子類中,您可以在接口 文件中聲明建模屬性的屬性,但是您不聲明實例變量的

+0

Core Data文檔的另一個值得參考的部分是[託管對象訪問器方法](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html )。特別是如果你對定製獲得者和制定者感興趣的話 –

+1

@downvoter:如果你要留言,那麼我可以嘗試修復或改進我的答案。我沒有任何問題可以承認錯誤,或者刪除我的答案而選擇更好的答案。 –

+0

非常感謝這個答案 - 它確實幫助我理解了NSManagedObjects的使用。 –