Подробные данные реализации поиска средства доступа

Кодирование значения ключа пытается использовать методы доступа получить и установить значения, прежде, чем обратиться к прямому доступу к переменной экземпляра. Эта статья описывает, как методы кодирования значения ключа определяют, как к значению получают доступ.

Образцы поиска средства доступа для простых атрибутов

Поисковый Образец по умолчанию для setValue:forKey:

Когда реализация по умолчанию setValue:forKey: вызывается для свойства, следующий поисковый образец используется:

  1. Класс получателя ищется метод доступа, имя которого соответствует образец set<Key>:.

  2. Если никакое средство доступа не найдено, и метод класса получателя accessInstanceVariablesDirectly возвраты YES, получатель ищется переменную экземпляра, имя которой соответствует образец _<key>, _is<Key>, <key>, или is<Key>, в том порядке.

  3. Если соответствующее средство доступа или переменная экземпляра расположены, это используется для установки значения. Если необходимо, значение извлечено из объекта, как описано в Представлении Необъектных Значений.

  4. Если никакое надлежащее средство доступа или переменная экземпляра не найдены, setValue:forUndefinedKey: вызывается для получателя.

Поисковый Образец по умолчанию для valueForKey:

Когда реализация по умолчанию valueForKey: вызывается на получатель, следующий поисковый образец используется:

  1. Ищет класс получателя для метода доступа, имя которого соответствует образец get<Key>, <key>, или is<Key>, в том порядке. Если такой метод найден, он вызывается. Если тип результата метода является объектным типом указателя, результат просто возвращается. Если тип результата является одним из скалярных типов, поддерживаемых NSNumber преобразование сделано и NSNumber возвращается. Иначе, преобразование сделано и NSValue возвращается. Результаты произвольных типов преобразовываются в NSValue объекты, не просто NSPoint, NSRange, NSRect, и NSSize типы).

  2. Иначе (никакой простой метод доступа не найден), ищет класс получателя для методов, имена которых соответствуют образцы countOf<Key> и objectIn<Key>AtIndex: (соответствие примитивным методам, определенным NSArray класс) и <key>AtIndexes: (соответствие NSArray метод objectsAtIndexes:).

    Если countOf<Key> метод и по крайней мере один из других двух возможных методов найдены, объект прокси набора, реагирующий на все NSArray методы возвращаются. Каждый NSArray сообщение, отправленное в объект прокси набора, приведет к некоторой комбинации countOf<Key>, objectIn<Key>AtIndex:, и <key>AtIndexes: сообщения, отправляемые в исходный получатель valueForKey:. Если класс получателя также реализует дополнительный метод, имя которого соответствует образец get<Key>:range: тот метод будет использоваться в надлежащих случаях для лучшей производительности.

  3. Иначе (никакой простой метод доступа или набор методов доступа к массиву не найдены), ищет класс получателя для тройки методов, имена которых соответствуют образцы countOf<Key>, enumeratorOf<Key>, и memberOf<Key>: (соответствие примитивным методам, определенным NSSet класс).

    Если все три метода найдены, объект прокси набора, реагирующий на все NSSet методы возвращаются. Каждый NSSet сообщение, отправленное в объект прокси набора, приведет к некоторой комбинации countOf<Key>, enumeratorOf<Key>, и memberOf<Key>: сообщения, отправляемые в исходный получатель valueForKey:.

  4. Иначе (никакой простой метод доступа или набор методов доступа набора не найдены), если метод класса получателя accessInstanceVariablesDirectly возвраты YES, класс получателя ищется переменную экземпляра, имя которой соответствует образец _<key>, _is<Key>, <key>, или is<Key>, в том порядке. Если такая переменная экземпляра найдена, значение переменной экземпляра в получателе возвращается. Если тип результата является одним из скалярных типов, поддерживаемых NSNumber преобразование сделано и NSNumber возвращается. Иначе, преобразование сделано и NSValue возвращается. Результаты произвольных типов преобразовываются в NSValue объекты, не просто NSPoint, NSRange, NSRect, и NSSize типы.

  5. Если ни одна из вышеупомянутых ситуаций не происходит, возвращает результат, который вызывает реализация по умолчанию valueForUndefinedKey:.

Образец поиска средства доступа для упорядоченных наборов

Поисковый образец по умолчанию для mutableArrayValueForKey: следующие:

  1. Класс получателя ищется пару методов, имена которых соответствуют образцы insertObject:in<Key>AtIndex: и removeObjectFrom<Key>AtIndex: (соответствие NSMutableArray примитивные методы insertObject:atIndex: и removeObjectAtIndex: соответственно), или методы, соответствующие образец insert<Key>:atIndexes: и remove<Key>AtIndexes: (соответствие NSMutableArrayinsertObjects:atIndexes: и removeObjectsAtIndexes: методы).

    Если по крайней мере один метод вставки и по крайней мере один метод удаления найдены каждым NSMutableArray сообщение, отправленное в объект прокси набора, приведет к некоторой комбинации insertObject:in<Key>AtIndex:, removeObjectFrom<Key>AtIndex:, insert<Key>:atIndexes:, и remove<Key>AtIndexes: сообщения, отправляемые в исходный получатель mutableArrayValueForKey:.

    Если класс получателя также реализует дополнительный метод объекта замены, соответствующий образец replaceObjectIn<Key>AtIndex:withObject: или replace<Key>AtIndexes:with<Key>: тот метод будет использоваться в надлежащих случаях для лучшей производительности.

  2. Иначе, класс получателя ищется метод доступа, имя которого соответствует образец set<Key>:. Если такой метод найден каждым NSMutableArray сообщение, отправленное в объект прокси набора, приведет к a set<Key>: сообщение, отправляемое в исходный получатель mutableArrayValueForKey:. Намного более эффективно реализовать индексируемые методы доступа, обсужденные на предыдущем шаге.

  3. Иначе, если отвечает класс получателя YES к accessInstanceVariablesDirectly, класс получателя ищется переменную экземпляра, имя которой соответствует образец _<key> или <key>, в том порядке.

    Если такая переменная экземпляра найдена, каждый NSMutableArray сообщение, отправленное в объект прокси набора, будет передано к значению переменной экземпляра, которое обычно будет экземпляром NSMutableArray или подкласс NSMutableArray.

  4. Иначе, возвращается, непостоянный прокси набора возражают что результаты в a setValue:forUndefinedKey: сообщение, отправляемое в исходный получатель mutableArrayValueForKey: обменивайтесь сообщениями каждый раз, когда прокси получает NSMutableArray сообщение.

    Реализация по умолчанию setValue:forUndefinedKey: повышения NSUndefinedKeyException, но можно переопределить его в приложении.

Образец поиска средства доступа для Uniquing упорядоченные наборы

Реализация по умолчанию mutableOrderedSetValueForKey: распознает те же простые методы доступа и методы доступа упорядоченного набора как valueForKey (см. Поисковый Образец По умолчанию для valueForKey:), и следует за теми же прямыми политиками доступа переменной экземпляра, но всегда возвращает непостоянный объект прокси набора вместо неизменного набора это valueForKey: возвратился бы. Это также:

  1. Ищет класс получателя для методов, имена которых соответствуют образцы insertObject:in<Key>AtIndex: и removeObjectFrom<Key>AtIndex: (соответствие двум самым примитивным методам, определенным NSMutableOrderedSet класс), и также insert<Key>:atIndexes: и remove<Key>AtIndexes: (соответствие insertObjects:atIndexes:] и removeObjectsAtIndexes:).

    Если по крайней мере один метод вставки и по крайней мере один метод удаления найдены каждым NSMutableOrderedSet сообщение, отправленное в объект прокси набора, приведет к некоторой комбинации insertObject:in<Key>AtIndex:, removeObjectFrom<Key>AtIndex:, insert<Key>:atIndexes:, и remove<Key>AtIndexes: сообщения, отправляемые в исходный получатель mutableOrderedSetValueForKey:.

    Если класс получателя также реализует дополнительный метод, имя которого соответствует образец replaceObjectIn<Key>AtIndex:withObject: или replace<Key>AtIndexes:with<Key>: тот метод будет использоваться в надлежащих случаях для лучшей производительности.

  2. Иначе, ищет класс получателя для метода доступа, имя которого соответствует образец set<Key>:. Если такой метод будет найден, то каждое сообщение NSMutableOrderedSet, отправленное в объект прокси набора, приведет к a set<Key>: сообщение, отправляемое в исходный получатель mutableOrderedSetValueForKey:.

  3. Иначе, если класс получателя accessInstanceVariablesDirectly возвраты метода YES, ищет класс получателя для переменной экземпляра, имя которой соответствует образец _ <ключ> или <ключ> в том порядке. Если такая переменная экземпляра найдена, каждый NSMutableOrderedSet сообщение, отправленное в объект прокси набора, будет передано к значению переменной экземпляра, которое поэтому должно обычно быть экземпляром NSMutableOrderedSet или подкласса NSMutableOrderedSet.

  4. Иначе, возвращает непостоянный объект прокси набора так или иначе. Каждый NSMutableOrderedSet сообщение, отправленное в объект прокси набора, приведет к a setValue:forUndefinedKey: сообщение, отправляемое в исходный получатель mutableOrderedSetValueForKey:. Реализация по умолчанию setValue:forUndefinedKey: повышения NSUndefinedKeyException, но можно переопределить его в приложении.

Образец поиска средства доступа для неупорядоченных наборов

Поисковый образец по умолчанию для mutableSetValueForKey: следующие:

  1. Ищет класс получателя методы, имена которых соответствуют образцы add<Key>Object: и remove<Key>Object: (соответствие NSMutableSet примитивные методы addObject: и removeObject: соответственно) и также add<Key>: и remove<Key>: (соответствие NSMutableSet методы unionSet: и minusSet:). Если по крайней мере один дополнительный метод и по крайней мере один метод удаления найдены каждым NSMutableSet сообщение, отправленное в объект прокси набора, приведет к некоторой комбинации add<Key>Object:, remove<Key>Object:, add<Key>:, и remove<Key>: сообщения, отправляемые в исходный получатель mutableSetValueForKey:.

    Если класс получателя также реализует дополнительный метод, имя которого соответствует образец intersect<Key>: или set<Key>:, тот метод будет использоваться в надлежащих случаях для лучшей производительности.

  2. Если получатель является управляемым объектом, поисковый образец не продолжается, как это было бы для неуправляемых объектов. Посмотрите Методы доступа Управляемого объекта в Базовом Руководстве по программированию Данных для получения дополнительной информации.

  3. Иначе, класс получателя ищется метод доступа, имя которого соответствует образец set<Key>:. Если такой метод найден, каждый NSMutableSet сообщение, отправленное в объект прокси набора, приведет к a set<Key>: сообщение, отправляемое в исходный получатель mutableSetValueForKey:.

  4. Иначе, если метод класса получателя accessInstanceVariablesDirectly возвраты YES, класс ищется переменную экземпляра, имя которой соответствует образец _<key> или <key>, в том порядке. Если такая переменная экземпляра найдена, каждый NSMutableSet сообщение, отправленное в объект прокси набора, будет передано к значению переменной экземпляра, которое поэтому должно обычно быть экземпляром NSMutableSet или подкласс NSMutableSet.

  5. Иначе, возвращает непостоянный объект прокси набора так или иначе. Каждый NSMutableSet сообщение, отправленное в объект прокси набора, приведет к a setValue:forUndefinedKey: сообщение, отправляемое в исходный получатель mutableSetValueForKey:.