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)
fonte
2011-09-13 15:44:59
Hai anche bisogno di inquadrare il codice con getter 'willAccessValueForKey:' e 'didAccessValueForKey:' per garantire che i guasti, se necessario, vengono licenziati? – jrturton
Sì, mi mancava, ho aggiornato il codice. –
Grazie mille Mike! – Akshay