Sto tentando di capire un po 'meglio il meccanismo Key-Value Coding (KVC) di Cocoa. Ho letto il numero Key-Value Programming Guide di Apple, ma sono ancora un po 'confuso su come determinati metodi KVC cercano le chiavi. In particolare, mutableArrayValueForKey:.Qual è il pattern di ricerca KVC per mutableArrayValueForKey?
Di seguito spiegherò come ho capito valueForKey:
"getter" KVC per funzionare. Poi passerò alla mia domanda riguardante mutableArrayValueForKey.
Ci sono sette diversi "getter" metodi KVC:
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
Durante la ricerca di un valore all'interno di una proprietà (nome myKey), documenti di Apple affermano che valueForKey: Ricerche come questo :
- Tenta
-getMyKey
,-myKey
, e-isMyKey
(in questo ordine) nel ricevitore Se non viene trovato, esso tenta questi ordinato, a-molti getter (NSArray):
// Required: - (NSUInteger)countOfMyKey; // Requires At Least One: - (id)objectInMyKeyAtIndex:(NSUInteger)index; - (NSArray *)myKeyAtIndexes:(NSIndexSet *)indexes; // Optional (improves performance): - (void)getMyKey:(KeyClass **)buffer range:(NSRange)inRange;
successivo, si tenta questi non ordinati, getter a-molti (NSSet) :
- (NSUInteger)countOfMyKey; - (NSEnumerator *)enumeratorOfMyKey; - (KeyClass *)memberOfMyKey:(KeyClass *)anObject;
successivo, si tenta di accedere direttamente variabili istanza, assumendo
YES
viene restituito daaccessInstanceVariablesDirectly
, nell'ordine:_myKey
,_isMyKey
,myKey
,isMyKey
.Infine, abbandona e chiama il metodo
- (id)valueForUndefinedKey:(NSString *)key
della classe ricevente. Solitamente viene generato un errore qui.
La mia domanda è, qual è il modello di ordine di ricerca per mutableArrayValueForKey :?
Accessor modello di ricerca per ordinati Collezioni
Il modello di ricerca predefinito per mutableArrayValueForKey: è come segue:
classe del ricevitore è cercato un paio dei metodi i cui nomi corrispondono ai modelli -insertObject: inAtIndex: e -removeObjectFromAtIndex: (corrispondente ai metodi primitivi NSMutableArray InsertObject: atIndex: e removeObjectAtIndex: rispettivamente), o metodi corrispondenti al modello -Insert : atIndexes: e -removeAtIndexes: (corrispondente ai NSMutableArrayinsertObjects: atIndexes : e removeObjectsAtIndexes: metodi). Se almeno un metodo di inserimento e almeno un metodo di rimozione si trovano ogni messaggio inviato al NSMutableArray dell'oggetto insieme proxy risultato in una combinazione di -insertObject: inAtIndex :, -removeObjectFromAtIndex :, -Insert: atIndexes: e -removeAtIndexes: messaggi inviati al ricevitore originale di mutableArrayValueForKey :. ... ecc ...
Questo non ha senso per me in quanto sta discutendo di metodi "setter". mutableArrayValueForKey:
restituisce un NSMutableArray. Tutti i metodi sopra elencati sono resi nulli e vengono utilizzati per modificare un NSMutableArray, non per ottenerlo. Esempio:
- (void)insertMyKey:(KeyClass *)keyObject inMyKeyAtIndex:(NSUInteger)index;
- (void)removeObjectFromMyKeyAtIndex:(NSUInteger)index;
Qualche idea di cosa Apple sta cercando di dire nei propri documenti o se questo è forse un errore?
La mia teoria è che mutableArrayValueForKey:
sta probabilmente prendendo un percorso simile a valueForKey:
durante la ricerca per recuperare un valore KVC. Non sono sicuro di quale sia il percorso.
Grazie per l'aiuto che puoi offrire! :)
Grazie Brian, che era estremamente disponibile. :) –
"Questo pezzo di codice aggiunge una traccia per l'inizio della playlist", penso che aggiunge una traccia all'inizio dei brani, non playlist? –
è importante dire che questo approccio è rilevante quando vengono utilizzati i binding. Nell'esempio di cui sopra, se Playlist è un NSArrayController legato alla matrice tracce e abbiamo un NSTableView vincolato a questo controller, quindi in ordine per modifiche sui brani riflettersi in tavola attraverso il controller di array, dobbiamo ottenere tracce dal mutevole array proxy e quindi aggiungi/rimuovi oggetti su questa traccia: infatti queste operazioni rifletteranno ai comandi KVC che attiveranno il meccanismo di binding. – viggio24