Estoy intentando entender el mecanismo de clave-valor de codificación (KVC) de Cocoa un poco mejor. He leído el número Key-Value Programming Guide de Apple, pero todavía estoy un poco confundido acerca de cómo ciertos métodos KVC buscan claves. Particularmente, mutableArrayValueForKey:.¿Cuál es el patrón de búsqueda de KVC para mutableArrayValueForKey?
A continuación explicaré cómo entiendo valueForKey:
KVC "getters" para trabajar. Luego, llegaré a mi pregunta sobre mutableArrayValueForKey.
Hay siete diferentes "getter" métodos 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 búsqueda de un valor dentro de una propiedad (llamado myKey), documentos de Apple estado que valueForKey: búsquedas como esta :
- Tries
-getMyKey
,-myKey
y-isMyKey
(en ese orden) dentro del receptor Si no lo encuentra, intenta estos pidió, a varios captadores (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;
A continuación, intenta estos, captadores desordenadas-a-muchos (NSSet) :
- (NSUInteger)countOfMyKey; - (NSEnumerator *)enumeratorOfMyKey; - (KeyClass *)memberOfMyKey:(KeyClass *)anObject;
a continuación, los intentos de acceso directamente variables de instancia, suponiendo
YES
es devuelto poraccessInstanceVariablesDirectly
, en este orden:_myKey
,_isMyKey
,myKey
,isMyKey
.Por último, se da por vencido y llama al método
- (id)valueForUndefinedKey:(NSString *)key
de la clase receptora. Por lo general, un error se plantea aquí.
Mi pregunta es, ¿cuál es el patrón de orden de búsqueda de mutableArrayValueForKey :?
Accessor Patrón de búsqueda para Ordenadas Colecciones
El patrón de búsqueda por defecto para mutableArrayValueForKey: es como sigue:
clase del receptor se buscó un par de métodos cuyos nombres coinciden con los patrones -insertObject: inAtIndex: y -removeObjectFromAtIndex: (correspondientes a los métodos primitivos NSMutableArray InsertObject: atIndex: y removeObjectAtIndex: respectivamente), o métodos que coincida con el patrón -Insertar : atIndexes: y -removeAtIndexes: (correspondiente a las NSMutableArrayinsertObjects: atIndexes : y removeObjectsAtIndexes: methods). Si al menos un método de inserción y se encuentran al menos un método de eliminación de cada mensaje enviado a NSMutableArray el objeto de colección proxy resultado en alguna combinación de -insertObject: inAtIndex :, -removeObjectFromAtIndex :, -Insertar: atIndexes: y -removeAtIndexes: mensajes que se envían al receptor original de mutableArrayValueForKey :. ... etc ...
Esto no tiene sentido para mí ya que se trata de métodos tipo "setter". mutableArrayValueForKey:
devuelve un NSMutableArray. Todos los métodos enumerados anteriormente devuelven el vacío y se utilizan para editar un NSMutableArray, no para obtenerlo. Ejemplo:
- (void)insertMyKey:(KeyClass *)keyObject inMyKeyAtIndex:(NSUInteger)index;
- (void)removeObjectFromMyKeyAtIndex:(NSUInteger)index;
Alguna idea de lo que Apple está tratando de decir en sus documentos, o si esto es quizás un error?
Mi teoría es que mutableArrayValueForKey:
es probable que tome una ruta similar a valueForKey:
al buscar recuperar un valor de KVC. Simplemente no estoy seguro de qué camino es realmente.
¡Gracias por cualquier ayuda que pueda ofrecer! :)
Gracias Brian, eso fue extremadamente útil. :) –
"Este fragmento de código agrega una pista al comienzo de la lista de reproducción", creo que agrega una pista al comienzo de las pistas, ¿no de la lista de reproducción? –
es relevante decir que este enfoque es relevante cuando se usan enlaces. En el ejemplo anterior, si la lista de reproducción es un NSArrayController vinculado a la matriz de pistas y tenemos un NSTableView vinculado a este controlador, para que los cambios en las pistas se reflejen en la tabla a través del controlador de matriz, debemos obtener pistas de la variable array proxy y luego agregar/eliminar objetos en esta pista: de hecho, estas operaciones reflejarán los comandos de KVC que dispararán el mecanismo de enlace. – viggio24