Подробные данные реализации поиска средства доступа
Кодирование значения ключа пытается использовать методы доступа получить и установить значения, прежде, чем обратиться к прямому доступу к переменной экземпляра. Эта статья описывает, как методы кодирования значения ключа определяют, как к значению получают доступ.
Образцы поиска средства доступа для простых атрибутов
Поисковый Образец по умолчанию для setValue:forKey:
Когда реализация по умолчанию setValue:forKey: вызывается для свойства, следующий поисковый образец используется:
Класс получателя ищется метод доступа, имя которого соответствует образец
set<Key>:.Если никакое средство доступа не найдено, и метод класса получателя
accessInstanceVariablesDirectlyвозвратыYES, получатель ищется переменную экземпляра, имя которой соответствует образец_<key>,_is<Key>,<key>, илиis<Key>, в том порядке.Если соответствующее средство доступа или переменная экземпляра расположены, это используется для установки значения. Если необходимо, значение извлечено из объекта, как описано в Представлении Необъектных Значений.
Если никакое надлежащее средство доступа или переменная экземпляра не найдены,
setValue:forUndefinedKey:вызывается для получателя.
Поисковый Образец по умолчанию для valueForKey:
Когда реализация по умолчанию valueForKey: вызывается на получатель, следующий поисковый образец используется:
Ищет класс получателя для метода доступа, имя которого соответствует образец
get<Key>,<key>, илиis<Key>, в том порядке. Если такой метод найден, он вызывается. Если тип результата метода является объектным типом указателя, результат просто возвращается. Если тип результата является одним из скалярных типов, поддерживаемыхNSNumberпреобразование сделано иNSNumberвозвращается. Иначе, преобразование сделано иNSValueвозвращается. Результаты произвольных типов преобразовываются вNSValueобъекты, не простоNSPoint,NSRange,NSRect, иNSSizeтипы).Иначе (никакой простой метод доступа не найден), ищет класс получателя для методов, имена которых соответствуют образцы
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:тот метод будет использоваться в надлежащих случаях для лучшей производительности.Иначе (никакой простой метод доступа или набор методов доступа к массиву не найдены), ищет класс получателя для тройки методов, имена которых соответствуют образцы
countOf<Key>,enumeratorOf<Key>, иmemberOf<Key>:(соответствие примитивным методам, определеннымNSSetкласс).Если все три метода найдены, объект прокси набора, реагирующий на все
NSSetметоды возвращаются. КаждыйNSSetсообщение, отправленное в объект прокси набора, приведет к некоторой комбинацииcountOf<Key>,enumeratorOf<Key>, иmemberOf<Key>:сообщения, отправляемые в исходный получательvalueForKey:.Иначе (никакой простой метод доступа или набор методов доступа набора не найдены), если метод класса получателя
accessInstanceVariablesDirectlyвозвратыYES, класс получателя ищется переменную экземпляра, имя которой соответствует образец_<key>,_is<Key>,<key>, илиis<Key>, в том порядке. Если такая переменная экземпляра найдена, значение переменной экземпляра в получателе возвращается. Если тип результата является одним из скалярных типов, поддерживаемыхNSNumberпреобразование сделано иNSNumberвозвращается. Иначе, преобразование сделано иNSValueвозвращается. Результаты произвольных типов преобразовываются вNSValueобъекты, не простоNSPoint,NSRange,NSRect, иNSSizeтипы.Если ни одна из вышеупомянутых ситуаций не происходит, возвращает результат, который вызывает реализация по умолчанию
valueForUndefinedKey:.
Образец поиска средства доступа для упорядоченных наборов
Поисковый образец по умолчанию для mutableArrayValueForKey: следующие:
Класс получателя ищется пару методов, имена которых соответствуют образцы
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>:тот метод будет использоваться в надлежащих случаях для лучшей производительности.Иначе, класс получателя ищется метод доступа, имя которого соответствует образец
set<Key>:. Если такой метод найден каждымNSMutableArrayсообщение, отправленное в объект прокси набора, приведет к aset<Key>:сообщение, отправляемое в исходный получательmutableArrayValueForKey:. Намного более эффективно реализовать индексируемые методы доступа, обсужденные на предыдущем шаге.Иначе, если отвечает класс получателя
YESкaccessInstanceVariablesDirectly, класс получателя ищется переменную экземпляра, имя которой соответствует образец_<key>или<key>, в том порядке.Если такая переменная экземпляра найдена, каждый
NSMutableArrayсообщение, отправленное в объект прокси набора, будет передано к значению переменной экземпляра, которое обычно будет экземпляромNSMutableArrayили подклассNSMutableArray.Иначе, возвращается, непостоянный прокси набора возражают что результаты в a
setValue:forUndefinedKey:сообщение, отправляемое в исходный получательmutableArrayValueForKey:обменивайтесь сообщениями каждый раз, когда прокси получаетNSMutableArrayсообщение.Реализация по умолчанию setValue:forUndefinedKey: повышения
NSUndefinedKeyException, но можно переопределить его в приложении.
Образец поиска средства доступа для Uniquing упорядоченные наборы
Реализация по умолчанию mutableOrderedSetValueForKey: распознает те же простые методы доступа и методы доступа упорядоченного набора как valueForKey (см. Поисковый Образец По умолчанию для valueForKey:), и следует за теми же прямыми политиками доступа переменной экземпляра, но всегда возвращает непостоянный объект прокси набора вместо неизменного набора это valueForKey: возвратился бы. Это также:
Ищет класс получателя для методов, имена которых соответствуют образцы
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>:тот метод будет использоваться в надлежащих случаях для лучшей производительности.Иначе, ищет класс получателя для метода доступа, имя которого соответствует образец
set<Key>:. Если такой метод будет найден, то каждое сообщение NSMutableOrderedSet, отправленное в объект прокси набора, приведет к aset<Key>:сообщение, отправляемое в исходный получательmutableOrderedSetValueForKey:.Иначе, если класс получателя
accessInstanceVariablesDirectlyвозвраты методаYES, ищет класс получателя для переменной экземпляра, имя которой соответствует образец _ <ключ> или <ключ> в том порядке. Если такая переменная экземпляра найдена, каждыйNSMutableOrderedSetсообщение, отправленное в объект прокси набора, будет передано к значению переменной экземпляра, которое поэтому должно обычно быть экземпляромNSMutableOrderedSetили подклассаNSMutableOrderedSet.Иначе, возвращает непостоянный объект прокси набора так или иначе. Каждый
NSMutableOrderedSetсообщение, отправленное в объект прокси набора, приведет к asetValue:forUndefinedKey:сообщение, отправляемое в исходный получательmutableOrderedSetValueForKey:. Реализация по умолчаниюsetValue:forUndefinedKey:повышенияNSUndefinedKeyException, но можно переопределить его в приложении.
Образец поиска средства доступа для неупорядоченных наборов
Поисковый образец по умолчанию для mutableSetValueForKey: следующие:
Ищет класс получателя методы, имена которых соответствуют образцы
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>:, тот метод будет использоваться в надлежащих случаях для лучшей производительности.Если получатель является управляемым объектом, поисковый образец не продолжается, как это было бы для неуправляемых объектов. Посмотрите Методы доступа Управляемого объекта в Базовом Руководстве по программированию Данных для получения дополнительной информации.
Иначе, класс получателя ищется метод доступа, имя которого соответствует образец
set<Key>:. Если такой метод найден, каждыйNSMutableSetсообщение, отправленное в объект прокси набора, приведет к aset<Key>:сообщение, отправляемое в исходный получательmutableSetValueForKey:.Иначе, если метод класса получателя
accessInstanceVariablesDirectlyвозвратыYES, класс ищется переменную экземпляра, имя которой соответствует образец_<key>или<key>, в том порядке. Если такая переменная экземпляра найдена, каждыйNSMutableSetсообщение, отправленное в объект прокси набора, будет передано к значению переменной экземпляра, которое поэтому должно обычно быть экземпляромNSMutableSetили подклассNSMutableSet.Иначе, возвращает непостоянный объект прокси набора так или иначе. Каждый
NSMutableSetсообщение, отправленное в объект прокси набора, приведет к asetValue:forUndefinedKey:сообщение, отправляемое в исходный получательmutableSetValueForKey:.