Я пытаюсь немного лучше понять механизм кодирования ключа-значения (KVC) Какао.Я прочитал Apple Key-Value Programming Guide , но все еще немного озадачен тем, как определенные методы KVC ищут ключи.В частности, mutableArrayValueForKey: .
Ниже я собираюсь объяснить, как я понимаю, valueForKey:
KVC "геттеры" работают.Затем я перейду к моему вопросу, касающемуся mutableArrayValueForKey.
Существует семь различных методов 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;
При поиске значения внутри свойства (с именем myKey ), документы Apple утверждают, что valueForKey: выглядит следующим образом:
- Пытается
-getMyKey
, -myKey
и -isMyKey
(в таком порядке) внутри получателя Если он не найден, он пытается получить эти упорядоченные, многие-геттеры (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;
Затем он пытается этинеупорядоченные методы получения ко-многим (NSSet):
- (NSUInteger)countOfMyKey;
- (NSEnumerator *)enumeratorOfMyKey;
- (KeyClass *)memberOfMyKey:(KeyClass *)anObject;
Затем он пытается получить прямой доступ к переменным экземпляра, предполагая, что YES
возвращается accessInstanceVariablesDirectly
в следующем порядке:_myKey
, _isMyKey
, myKey
, isMyKey
.
Наконец, он сдается и вызывает метод - (id)valueForUndefinedKey:(NSString *)key
принимающего класса.Обычно здесь возникает ошибка.
Мой вопрос: каков шаблон порядка поиска для mutableArrayValueForKey:?
Документы Apple утверждают это :
Шаблон поиска средства доступа для упорядоченных коллекций
Шаблон поиска по умолчанию для mutableArrayValueForKey: выглядит следующим образом:
Класс получателявыполняется поиск пары методов, имена которых соответствуют шаблонам -insertObject: inAtIndex: и -removeObjectFromAtIndex: (соответствует примитивным методам NSMutableArray: insertObject: atIndex: и removeObjectAtIndex: соответственно) или методам, соответствующим шаблону -insert: atIndexes: - иremoveAtIndexes: (соответствует NSMutableArrayinsertObjects: atIndexes: и removeObjectsAtIndexes: методы).Если найден хотя бы один метод вставки и хотя бы один метод удаления, каждое сообщение NSMutableArray, отправленное объекту-посреднику коллекции, приведет к некоторой комбинации -insertObject: inAtIndex :, -removeObjectFromAtIndex :, -insert: atIndexes :, и -removeAtIndexes: messagesотправляется исходному получателю mutableArrayValueForKey :.... и т.д ...
Это не имеет смысла для меня, так как здесь обсуждаются методы, подобные "сеттерам".mutableArrayValueForKey:
возвращает NSMutableArray.Все перечисленные выше методы возвращают void и используются для редактирования NSMutableArray, а не для его получения.Пример:
- (void)insertMyKey:(KeyClass *)keyObject inMyKeyAtIndex:(NSUInteger)index;
- (void)removeObjectFromMyKeyAtIndex:(NSUInteger)index;
Любая идея, что Apple пытается сказать в своих документах, или, возможно, это ошибка?
Моя теория состоит в том, что mutableArrayValueForKey:
, вероятно, идет по тому же пути.как valueForKey:
при поиске для получения значения KVC.Я просто не уверен, какой путь это действительно.
Спасибо за любую помощь, которую вы можете предложить!:)