2011-09-13 6 views
6

Ho una sottoclasse MyClass con una proprietà myProp, che è definita @dynamic. Ci sono varie istanze di lettura myProp nel mio codice, tramite [myClass myProp].Objective-C: override getter dinamico

Ora, voglio definire un getter (che restituisce myProp dopo averlo aggiunto qualcosa) per myProp, senza cambiare le varie chiamate a [myClass myProp]. vale a dire senza creare un getter che è chiamato qualcosa di diverso da getMyProp.

La mia domanda è, se creo un getter getMyProp, che sovrascriverà il getter creato da NSManagedObject, come posso accedere al valore originale che è memorizzato nel database?

Grazie,

Akshay

risposta

17

Per accedere ai valori alla base di un oggetto gestito di utilizzare i seguenti due metodi:

- (id)primitiveValueForKey:(NSString *)key

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

Questo è spesso utilizzato per convertire gli attributi NSNumber nel loro tipo 'reale', ad esempio una proprietà bool:

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

Il willAccessValueForKey: e didAccessValueForKey: sono richiesti dalla classe oggetto gestito sottostante per la gestione di guasti e le relazioni, ecc

E se lo fai finire per scrivere un setter, è necessario anche avvolgere la funzione di accesso a metodi KVC:

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

detto questo, non vorrei personalmente consiglierei di mantenere lo stesso nome del metodo meno che non abbiate una buona ragione. Per i valori "derivati" in genere si desidera creare un metodo nuovo di zecca con un nome diverso. Non ci vuole molto a fare una rapida ricerca/sostituzione in tutto il codice.

EDIT: aggiunto willAccessValueForKey:/didAccessValueForKey: (grazie jrturton)

+0

Hai anche bisogno di inquadrare il codice con getter 'willAccessValueForKey:' e 'didAccessValueForKey:' per garantire che i guasti, se necessario, vengono licenziati? – jrturton

+0

Sì, mi mancava, ho aggiornato il codice. –

+0

Grazie mille Mike! – Akshay