2011-09-13 17 views
6

我有一個NSManagedObject子類MyClass與屬性myProp,它定義爲@dynamic。通過[myClass myProp]可以在我的代碼中讀取myProp的各種實例。Objective-C:override override dynamic getter

現在,我想爲myProp定義一個吸氣劑(返回myProp後),而不更改對[myClass myProp]的各種調用。即不創建名爲getMyProp以外的名稱的吸氣劑。

我的問題是,如果我創建了一個獲取者getMyProp,它將覆蓋由NSManagedObject創建的獲取者,我如何訪問存儲在數據庫中的原始值?

感謝,

阿克沙伊

回答

17

要訪問您使用以下兩種方法管理對象的基本價值:

- (id)primitiveValueForKey:(NSString *)key

- (void)setPrimitiveValue:(id)value forKey:(NSString *)key

這通常是用來將NSNumber屬性轉換爲它們的「真實」類型,例如bool屬性:

- (BOOL)isShared 
{ 
    [self willAccessValueForKey:@"isShared"]; 
    NSNumber *underlyingValue = [self primitiveValueForKey:@"isShared"]; 
    [self didAccessValueForKey:@"isShared"]; 
    return [underlyingValue boolValue]; 
} 

willAccessValueForKey:didAccessValueForKey:需要由基礎管理對象類用於處理故障和關係等

如果你這樣做最終會寫一個二傳手,你也必須在包裝方法KVC存取:

- (void)setShared:(BOOL)isShared 
{ 
    NSNumber *newUnderlyingValue = [NSNumber numberWithBool:isShared]; 
    [self willChangeValueForKey:@"isShared"]; 
    [self setPrimitiveValue:newUnderlyingValue forKey:@"isShared"]; 
    [self didChangeValueForKey:@"isShared"]; 
} 

話雖如此,我個人不建議你保持相同的方法名稱,除非你有一個很好的理由。對於「派生」值,您通常需要使用不同的名稱創建全新的方法。在整個代碼中快速查找/替換並不需要很長時間。

編輯:添加willAccessValueForKey:/ didAccessValueForKey:(感謝jrturton)

+0

你也需要用括號'willAccessValueForKey您的getter代碼:'和'didAccessValueForKey:'以確保故障在必要時解僱? – jrturton

+0

是的,謝謝我錯過了,我更新了代碼。 –

+0

非常感謝Mike! – Akshay