2014-04-28 58 views
0

我開始學習如何使用核心數據爲我的應用程序,我有一個關於setter和getter與NSManagedObject問題。遷移從自制模型的核心數據模型:二傳手/吸氣問題

在我的老款我是用這個語法來聲明屬性:

@interface MyModel : NSObject 
{ 
    MyAttributeOfClass *_myAttributeOfClass 
} 

- (void)setMyAttributeOfClass:(MyAttributeOfClass *)anAttributeOfClass; 
- (MyAttributeOfClass *)myAttributeOfClass; 

我知道,我可以用@synthesize做這個東西。但是,如果使用@synthesize具有公共屬性,如:

@property (nonatomic, strong) MyAttributeOfClass *myAttributeOfClass; 

開發人員可以繞過我的setter和直接做這個設定值myAttributeOfClassmyAttributeOfClass = bar;。我不想允許這種行爲,因爲我使用setter來執行操作。如果此操作未完成,我的課程將不再正常工作。

所以,現在我遷移我的舊模式,從NSManagedObject子類核心數據模型。

但是,當我生成從我的數據模型類,屬性以這種方式聲明:

@property (nonatomic, retain) MyAttribute *myAttribute; 

因此,開發人員可以設置該屬性的值,而無需調用setter:myAttribute =欄;我想禁止它。

有什麼建議嗎?

謝謝!

回答

2

核心數據的屬性管理通過實例變量對象不會備份。屬性可以使用屬性的語法進行設置:

object.myAttribute = bar; 

或與鍵 - 值編碼:

[object setValue:bar forKey:@"myAttribute"]; 

和在兩種情況下設置器方法

-(void)setMyAttribute:(MyAttribute *)value; 

被調用。 Setter和getter方法通常在運行時動態創建,但你可以提供你自己的顯式setter和/或getter方法。

然而,可以通過調用「原始」的存取方法來繞過二傳手:

[object setPrimitiveValue:bar forKey:@"myAttribute"]; 

這是一個定製的setter方法會用什麼,但任何人都可以調用原始的訪問, 有沒有辦法抑制這一點。

+0

哦!我不認爲這個object.myAtteibute = bar叫我的自定義setter。謝謝你的回答! –

0

時,我想有一個私人二傳手我的做法是有這個在標題:

@property (nonatomic, strong, readonly) NSString* myProperty; 

然後在.m文件中加入:

@interface MyClass() 
@property (nonatomic, strong) NSString* myProperty; 
@end 

外部的屬性是讀 - 僅僅通過在實現文件中定義一個私有類別,該屬性在實現中被讀取。

+0

請注意,這仍然允許setPrimitiveValue和setValue:forKey:,但是,對於這個問題,Objective-C從來沒有真正的私有方法,因爲所有東西都可以通過反射找到。 –