Una classe ha una proprietà (e un'istanza var) di tipo NSMutableArray con accessors sintetizzati (tramite @property
). Se si osserva questa matrice utilizzando:Osservazione di un NSMutableArray per l'inserimento/rimozione
[myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL];
e quindi inserire un oggetto nella matrice come questo:
[myObj.theArray addObject:NSString.string];
Un observeValueForKeyPath ... notifica è non inviato. Tuttavia, il seguente fa inviare la corretta notifica:
[[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string];
Questo perché mutableArrayValueForKey
restituisce un oggetto proxy che si prende cura di notificare gli osservatori.
Ma gli accessori sintetizzati non dovrebbero restituire automaticamente tale oggetto proxy? Qual è il modo corretto per ovviare a questo: dovrei scrivere una funzione di accesso personalizzata che invochi solo [super mutableArrayValueForKey...]
?
Ottimo consiglio, grazie. –
Il problema n. 1 è che quando aggiungi un osservatore, stai osservando una proprietà di qualche oggetto. L'array è il * valore * di quella proprietà, non la proprietà stessa. Ecco perché è necessario utilizzare gli accessors o -mutableArrayValueForKey: per modificare l'array. –
L'ultimo punto sembra non essere aggiornato: ottengo notifiche KVO gratuite sulle proprietà NSArray, a condizione che implemento sia l'aggiunta che la rimozione degli accessor. – Bryan