Подробные данные реализации поиска средства доступа
Кодирование значения ключа пытается использовать методы доступа получить и установить значения, прежде, чем обратиться к прямому доступу к переменной экземпляра. Эта статья описывает, как методы кодирования значения ключа определяют, как к значению получают доступ.
Образцы поиска средства доступа для простых атрибутов
Поисковый Образец по умолчанию для 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:
(соответствиеNSMutableArray
insertObjects: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:
.