2015-05-22 51 views
0

我是Core Data的新手。我有一個自定義實體,可以擴展NSManagedObject。在這個類中是與核心數據實體屬性相對應的屬性列表。無法訪問NSManagedObject子類中的本地屬性

我已經在.h文件中聲明瞭屬性。我還填寫了該類的.m文件中的各個@dynamic聲明。 (當我從實體創建類時,所有這些都是由xCode自動生成的)

但是,在.m文件中,我添加了一些使用這些屬性的自定義方法。我通過_propertyName訪問它們。不過,我得到一個錯誤說

"Use of undeclared identifier '_propertyName' " 

即使財產已經聲明,並且該屬性的@dynamic宣言還存在。

此錯誤消失,當我將類更改爲擴展NSObject而不是NSManagedObject,並將@dynamic語句替換爲常規@synthesize語句。

我的問題是:

通常,我將能夠使用_propertyName從類中訪問屬性。當我使用核心數據時,似乎並不是這樣。爲什麼會發生這種情況,我將如何解決它?

如果需要,將提供更多細節。

+0

你嘗試像self.propertyName。我希望你知道_propertyName和self.propertyName之間的區別 –

+0

self.propertyName工作正常。 從我的理解,self.propertyName訪問getter方法,而_propertyName直接訪問本地屬性。我也是新來的Objective-C,所以請隨時糾正我,如果我錯了。 – sosale151

回答

1

@dynamic只聲明屬性,但不在類中實現。沒有getter和setter,也沒有實例變量被合成。它告訴編譯器不要擔心如何實現getter和setter,但是這些屬性將能夠在運行時處理get和set消息。在這種情況下,在超類NSManagedObject ... -valueForKey:-setValueForKey:中提供了實現。並且NSManagedObject有其自己的內部實現用於存儲您無權訪問的值。

但是,我相信你仍然可以使用self.來訪問這些屬性,因爲它在運行時自動調用valueForKeysetValueForKey

Apple's documentation

核心數據自動生成管理對象類的模型屬性(屬性和 關係)(見管理對象訪問器 方法),高效的公共和原始取得 並設置訪問方法。當您訪問或修改管理對象的屬性時,您應該直接使用這些方法。

在附註中,我絕不會向自動生成的.h或.m文件添加任何代碼,因爲只需要某人添加或刪除屬性並重新生成類以覆蓋您的內容已經完成了。相反,添加一個類別並編寫您需要的任何方法。

+0

你的答案幫助我理解這個負載,謝謝! – sosale151

+0

沒有概率! :) :) –

0

將自定義方法添加到NSManagedObject子類的最佳方法之一是向其添加Category

例如,考慮你的管理對象類是像

@interface AManagedObejctClass:NSManagedObject 

... // here you have properties 

@end 

然後創建一個Category這一類的樣子,AManagedObejctClass+DataPopulation

在這個類AManagedObejctClass+DataPopulation.h你有

#import "AManagedObejctClass.h" 

@interface AManagedObejctClass (DataPopulation) 

...//Add you custom method declaration here 

@end 

AManagedObejctClass+DataPopulation.m

#import "AManagedObejctClass+DataPopulation.h" 

@implementation AManagedObejctClass (DataPopulation) 

...//implement the custom method here 

@end 

該advanvan這種方法的好處在於,如果您在託管對象子類本身中添加了此自定義方法,則此自定義方法將在創建此類時再次丟失。如果您在數據模型中更改了屬性或其他屬性並創建了新模型,就可能發生這種情況。在這種情況下,您需要備份舊類並再次將這些方法添加到自定義類中。通過上述方法,可以避免這種情況,因爲在管理對象子類的重新創建時,類別保持不變。希望你明白這個主意。