Мой главный вопрос - куда идет мой код в шаблоне по умолчанию?
Предполагая, что приложение с одним окном, я создаю отдельный пользовательский контроллер для этого окна, и у меня есть делегат объекта приложения, которому принадлежит этот контроллер.
Итак:
Делегат объекта приложения
- Владеет пользовательским контроллером.
- Создает его в
applicationWillFinishLaunching:
(примечание: не Did
; я изменяю это).
- Отпускает его (и
nil
выводит переменную экземпляра) в applicationWillTerminate:
.
- Не владеет основным окном (я удаляю этот ivar и все ссылки на него).
- Отвечает на
applicationShouldTerminateAfterLastWindowClosed:
с помощью YES
, так что пользователь может выйти из приложения либо путем конкретного выхода, либо закрыв главное окно.
- Может также отвечать на
application:openFile:
или application:openFiles:
, обычно передавая файл (ы) вместе с контроллером для импорта или чего-то еще.
Перо MainMenu
- Владеет делегатом приложения.
- Не содержит главное окно (я удаляю пустое).
Контроллер основного окна
- Владеет главным окном.
- Владеет моделью, отображаемой в окне.
- Создает начальную / пустую модель в
init
.
- Загружает перо основного окна в качестве владельца в
init
.
- Закрывает и отпускает окно (первое) и освобождает модель (второе) и подчиненные контроллеры (третье) в
dealloc
.
Перо основного окна
- Назван аналогично контроллеру; например, «SnippetListController» для контроллера и «SnippetList» для пера.
- Содержит главное окно.
- В главном окне «видимый при запуске» (действительно при загрузке пера) включен и «отпущен при закрытии».
Преимущество всего этого заключается в том, что время жизни каждого объекта, кроме делегата приложения, является четким и явным, как и область ответственности. Делегат моего приложения немного больше; единственное, что он делает, а не является задачей делегата приложения, является владельцем контроллера основного окна. Аналогично, контроллер первичного окна делает только собственное главное окно и любую модель, которую я должен показать в этом окне. И в момент завершения все, кроме делегата приложения, блокируется.
Для приложений на основе документов я придерживаюсь довольно близко к шаблону. Я удаляю любые методы шаблона, которые мне не нужно настраивать, и я могу переключить один или оба метода ввода-вывода на одну из других версий (например, с readFromData:ofType:error:
до readFromURL:ofType:error:
), и, возможно, удалить запись метод, если я пишу только зрителю; вот и все.