Nib-файл — это коллекция потенциальных экземпляров, которые называются nib-объек-тами.

Эти экземпляры станут реальными, только если nib-файл загружается при выполнении приложения. В этот момент nib-объекты, содержащиеся в nib-файле, трансформируются в экземпляры, доступные для приложения.

Такая архитектура обеспечивает отличную производительность. Nib-файл обычно содержит интерфейс, а интерфейс — это довольно громоздкая вещь. Nib-файл не загружается, пока это не станет необходимым; в принципе, он может вообще никогда не загрузиться. В этом случае громоздкий интерфейс никогда не будет реализован, пока не станет необходимым. Это позволяет минимизировать требования к памяти, что на мобильных устройствах является главным моментом. Кроме того, загрузка nib-файла требует времени, поэтому для быстрого запуска приложения следует загружать небольшое количество nib-файлов, которые нужны только для начального интерфейса приложения.

 

Загрузка nib-файла напоминает одностороннее движение: “выгрузки” nib-файла не существует. После того как nib-файл загружен, возникают его экземпляры и на этом работа nib-файла пока закончена. Начиная с этого момента работающее приложение самостоятельно решает, что делать с возникшими экземплярами. Оно должно обращаться к ним, когда они нужны, и удалять их, когда они больше не нужны.

 

Nib-файл можно интерпретировать как набор инструкторов по генерированию экземпляров; эти инструкции выполняются при каждой загрузке nib-файла. Таким образом, один и тот же nib-файл можно загружать несколько раз, каждй раз генерируя новый набор экземпляров. Например, nib-файл может содержать фрагмент интерфейса, который используется в разных частях приложения. Nib-файл, представляющий отдельную строку таблицы, может загружаться десятки раз, чтобы генерировать десятки видимых строк этой таблицы.

Как указано в главе 5, экземпляры возникают тремя путями: как шаблонные экземпляры (путем вызова метода, создающего экземпляр), путем создания с нуля (с помощью вызова функции alloc) и с помощью загрузки nib-файла. Теперь пора перейти к обсуждению третьего способа создания экземпляров.

Кратко перечислим несколько ситуаций, в которых nib-файл загружается во время выполнения приложения.

 

Контроллер представления создается из файла раскадровки

Раскадровка — это коллекция сцен. Каждая сцена начинается с контроллера представления. Когда этот контроллер представления становится необходимым, он создается из раскадровки. Это значит, что загружается nib-файл, содержащий данный контроллер представления.

Обычно экземпляр контроллера представления создается из раскадровки автоматически. Например, при запуске приложения, имеющего главную раскадровку, система выполнения приложения ищет контроллер начального предствления и создает его экземпляр (см. главу 6). Аналогично раскадровка обычно содержит несколько сцен, связанных переходами (segues); при выполнении перехода создается экземпляр требуемого контроллера представления.

Кроме того, ваш код может создавать контроллер представления из раскадровки вручную. Контроллер начального представления из раскадровки можно создать, вызвав метод instantiatelnitialViewController, а любой контроллер представления, указанный в раскадровке строкой идентификатора, — с помощью метода instantiateViewContr ollerWithldentifier

(Отметим, что это не единственный способ создания экземпляра контроллера представления. Это совсем не так. Контроллер представления — это экземпляр, такой же, как любой другой, поэтому его можно создать, отдав инструкцию классу контроллера представления создать свой экземпляр. Эта процедура описана в главе б, в которой мы создали контроллер представления в приложении Truly Empty с помощью команды [ViewController new]. В этот момент не загружается ни один nib-файл; в этом случае экземпляр контроллера представления создается с нуля, а не с помощью nib-файла.)

 

Контроллер загружает свое главное представление из nib-файла

У контроллера есть главное представление. Однако контроллер — довольно простой объект (это просто некий код), а его главное представление — относительно громоздкий объект. Следовательно, в момент создания экземпляра контроллера ему недостает главного представления. Он генерирует его позже, когда оно понадобится, потому что его необходимо включить в интерфейс. Контроллер может получить свое главное представление несколькими путями; один из них — загрузить его из nib-файла.

Если контроллер является частью сцены в раскадровке и (как правило) имеет свое представление на канве этой раскадровки (как в нашем проекте Empty Window), то используются два nib-файла: nib-файл, содержащий контроллер, и nib-файл, содержащий его главное представления. Как указано выше, nib-файл, содержащий контроллер представления, был загружен в момент создания его экземпляра; теперь, когда экземпляру контроллера потребуется его главное представление, загружается соответствующий nib-файл, и весь интерфейс, связанный с этим контроллером, начинает работать.

Если экземпляр контроллера создается как-то иначе, то может существовать nib-файл, сгенерированный на основе файла . xib, связанного с контроллером и содержащего его главное представление. Контроллер представления автоматически загрузит этот nib-файл и извлечет требуемое главное представление. Связь между контроллером и его главным представлением обеспечивается через имя nib-файла. Это можно сделать двумя способами.

 

Автоматически, основываясь на имени класса контроллера представления

Мы видели этот способ в главе б при создании приложения Truly Empty. Класс контроллера представления назывался ViewController. Файл . xib, а значит и nib-файл, также назывался ViewController (игнорируя расширение файла). Этого достаточно для того, чтобы сообщить механизму загрузки nib-файла, где искать nib-файл, содержащий главное представление контроллера при необходимости.

 

Явно, с помощью свойства контроллера представления nibName

Когда экземпляр контроллера создается с помощью метода initWithNibName: bundle:, имя nib-файла, содержащего его главное представление, может быть задано явно с помощью аргумента nibName:. Этот аргумент задает свойство nibName экземпляра контроллера, которое используется для поиска nib-файла, когда требуется главное представление. В качестве альтернативы контроллер представления может задавать свое собственное свойство nibName в настройках.

Ваш код явно загружает nib-файл

Пока мы рассматривали ситуации, в которых nib-файл загружается автоматически. Однако, если nib-файл создается из файла . xib, код также может загружать его вручную, вызвав один из следующих методов.

 

loadNibNamed:owner:options:

Это метод экземпляра класса NSBundle. Обычно он вызывается так: [NSBundle mainBundle].

 

instantiateWithOwner:options:

Это метод экземпляра класса UINib. Требуемый nib-файл был указан, когда экземпляр класса UINib создавался и инициализировался с помощью метода nib-WithNibName:bundle:.

 

Для того чтобы указать nib-файл во время выполнения приложения, требуются два фрагмента информации — его имя и содержащий его комплект. Действительно, контроллер представления имеет не только свойство nibName, но и свойство nibBundle, а методы, задающие nib-файл, такие как initWithNibName:bundle: и nibWithNibName:bundle:, имеют параметры bundle:  и             имя        name:.   Однако  в              реальной             жизни    искомым комплектом будет комплект приложения (или, что то же самое, [NSBundle mainBundle]); это правило установлено по умолчанию, поэтому указывать комплект не обязательно.


 

 

 

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