Adding Behavior to a Cocoa Program
Основной координирующий объект приложения - NSApplicationMain. Он получает события, находит для них объекты-обработчики и так по кругу.
Последовательность такая: объект создается, устанавливается autorealese пул, загружается интерфейс из nib-файла, управление передается пользователю, т.е. обрабатываются внешние события.
Отличие библиотеки от фреймворка. Требуемая функциональность из библиотеки может быть получена напрямую, без создания дополнительной инфраструктуры объектов. При использовании фреймворка код приложения дополняет фреймворк, при использовании библиотеки код библиотеки дополняет приложение.
Фреймворк задает структуру и модель приложения. Для решения каждой задачи придется использовать столько классов, сколько предполагает фреймворк.
Вызовы из библиотеки можно рассматривать как использование независимых друг от друга сервисов.
В Cocoa есть классы, предоставляющие услуги
- напрямую,
- предназначенные для выполнения работы за кадром,
- в обобщенном виде (требуют конкретной реализации),
- через делегирование и уведомления.
Класс, допускающий делегирование, имеет протокол (интерфейс), методы которого могут реализовать делегаты. Делегат должен при этом зарегистрироваться у делегирующего класса.
Класс может опубликовать список уведомлений, которые он может рассылать всем заинтересованным объектам-подписчикам.
Делегаты и уведомления являются способами встраивания своего кода в фреймворк.
Cocoa API Conventions (некоторые)
Методы Cocoa могут возвращать nil, булевское значение, а также генерировать исключение при возникновении ошибок. Для ошибки может передаваться специальный аргумент.
Строки могут быть литералами (начинаются с @"") или константами. Предпочтительно использовать константные строки.
Метод, возвращающий значение атрибута, должен иметь имя атрибута, устанавливающий - начинаться с set, а затем имя атрибута с большой буквы.
Inheriting From a Cocoa Class
Значительная часть фреймворка имеет обобщенный вид (абстрактные классы).
В Cocoa часто происходит так: метод моего класса вызывает определенный метод фреймворка, а он в свою очередь вызывает какой-то свой метод, переопределенный в моем классе.
Готовым поведением можно воспользоваться, а можно переопределить его у себя в подклассе.
Некоторые методы имеют реализацию по умолчанию, возвращающую некоторое значение (YES или NO). Это значение определяет, включена или выключена некоторая возможность. Можно переопределить этот метод, чтобы переключить возможности.
Функциональность некоторых методов базового класса нужна в порожденном классе. В перекрываемом методе происходит дополнение базовой функциональности. Для этого порожденный метод отправляет сообщение родителю super, вызывающее одноименный с ним родительский метод.
Ну и конечно при обычном раскладе super-у сообщение посылать не нужно, нужно просто переопределить метод базового класса.
When to Make a Subclass
Нужно определить необходимый базовый класс (например, для MVC).
Если нужно добавить пару методов к существующему классу, то проще воспользоваться категорией.
Также не стоит забывать о возможности композиции с одновременным наследованием от того же класса.
Комментариев нет:
Отправить комментарий