Механизм доступа к значениям по ключам положен в основу принципа действия связей с выходами. Имя выхода представлено символьной строкой в nib-файле. Механизм доступа к значениям по ключам превращает символьную строку в критерий поиска подходящих методов доступа.

Допустим, имеется класс MyClass с переменной экземпляра myVar и в nib-файле установлена связь из выхода переменной myVar экземпляра, представляющего этот класс в nib-файле, к nib-объекту класса MyOtherClass. При загрузке nib-файла имя выхода myVar преобразуется в имя метода setMyVar:, а затем метод setMyVar: экземпляра класса MyClass, если он существует, вызывается с экземпляром класса MyOtherClass в качестве параметра. Таким образом, в качестве значения переменной myVar экземпляра класса MyClass устанавливается экземпляр класса MyOtherClass (см. рис. 7.7).

Если что-нибудь пойдет не так при проверке на совпадение имен выхода в nib-файле и переменной экземпляра или метода доступа в классе, то при загрузке nib-файла во время выполнения любая попытка воспользоваться в среде Cocoa механизмом доступа к значениям по ключам, чтобы установить значение в объекте на основании имени выхода, потерпит неудачу. В конечном в итоге возникнет исключение, уведомляющее о том, что класс несовместим с механизмом доступа к значениям по заданному ключу (в данном случае — по имени выхода). Это означает, что во время загрузки nib-файла в приложении произойдет аварийный сбой. Нечто подобное может, вероятнее всего, произойти потому, что сначала выход формируется правильно, а затем в классе происходит изменение имени (или вообще удаление) переменной экземпляра или метода доступа (см. раздел “Неправильная конфигурация выхода” в главе 7).

С другой стороны, имена методов доступа не следует употреблять в тех методах, которые не предназначены для доступа. Если вернуться к приведенному выше примеру класса MyClass и переменной экземпляра myVar, то вряд ли в этом классе понадобился бы метод setMyVar:, если он не предназначен для доступа к переменной экземпляра myVar. Если бы в этом классе действительно имелся такой метод, он вызывался бы при загрузке nib-файла, а механизм доступа к значениям по ключам попытался бы разрешить имя выхода myVar в nib-файле. Следовательно, данному методу был бы передан экземпляр класса MyOtherClass. В этом нет никакой ошибки, но экземпляр класса MyOtherClass не был бы присвоен переменной экземпляра myVar, поскольку setMyVar: не является методом доступа. В итоге ссылки в прикладном коде на переменную экземпляра myVar оказались бы пустыми (nil). Метод setMyVar: выполнял бы роль ложного фасада, препятствуя установке значения переменной экземпляра myVar во время загрузки nib-файла. Как ни странно, подобные ошибки совершаются довольно часто.


 

 

 

Добавить комментарий