Жизненный цикл приложения

Приложения являются сложным взаимодействием между Вашим пользовательским кодом и системными платформами. Системные платформы обеспечивают основную инфраструктуру, которую должны выполнить все приложения, и Вы обеспечиваете код, требуемый настроить ту инфраструктуру и дать приложению стиль, который Вы хотите. Чтобы сделать это эффективно, это помогает понять немного об инфраструктуре iOS и как это работает.

платформы iOS полагаются на шаблоны разработки, такие как контроллер представления модели и делегация в их реализации. Понимание тех шаблонов разработки крайне важно для успешного создания приложения. Это также помогает быть знакомым с языком Objective C и его функциями. Если Вы плохо знакомы с программированием iOS, читайте, Начинают Разрабатывать приложения для iOS Сегодня для введения в приложения для iOS и язык Objective C.

Основная функция

Точка входа для каждого приложения на базе С main функция и приложения для iOS не отличаются. То, что отличается, - то, что для приложений для iOS Вы не пишете main функция самостоятельно. Вместо этого XCode создает эту функцию как часть Вашего основного проекта. Перечисление 2-1 показывает пример этой функции. За редким исключением Вы никогда не должны изменять реализацию main функция, которую обеспечивает XCode.

Перечисление 2-1  main функция приложения для iOS

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
 
int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

Единственная вещь упомянуть о main функция состоит в том, что ее задание к ручному управлению прочь к платформе UIKit. UIApplicationMain функционируйте обрабатывает этот процесс путем создания базовых объектов приложения, загрузки пользовательского интерфейса приложения из доступных файлов раскадровки, вызова пользовательского кода так, чтобы Вы имели возможность сделать некоторую начальную настройку и приведение в движение цикла выполнения приложения. Единственные части, которые необходимо обеспечить, являются файлами раскадровки и пользовательским кодом инициализации.

Структура приложения

Во время запуска, UIApplicationMain функция устанавливает несколько ключевых объектов и запускает выполнение приложения. В основе каждого приложения для iOS UIApplication объект, задание которого должно упростить взаимодействия между системой и другими объектами в приложении. В то время как Таблица 2-1 перечисляет роли каждая из тех игр объектов, рисунок 2-1 показывает объекты, обычно находимые в большинстве приложений. Первая вещь заметить состоит в том, что приложения для iOS используют архитектуру контроллера представления модели. Этот образец разделяет данные приложения и бизнес-логику от визуального представления тех данных. Эта архитектура крайне важна для создания приложений, которые могут работать на различных устройствах с различными размерами экрана.

  Ключевые объекты рисунка 2-1 в приложении для iOS
Таблица 2-1  роль объектов в приложении для iOS

Объект

Описание

UIApplication объект

UIApplication объект управляет циклом событий и другими высокоуровневыми способами поведения приложения. Это также сообщает о переходах ключевого приложения и некоторых специальных мероприятиях (таких как входящие уведомления нажатия) его делегату, который является пользовательским объектом, который Вы определяете. Используйте UIApplication объект, как — т.е. без разделения на подклассы.

Делегат приложения объект

Делегат приложения является основой Вашего пользовательского кода. Этот объект работает в тандеме с UIApplication возразите для обработки инициализации приложения, изменений состояния и многих высокоуровневых событий приложения. Этот объект является также единственным, который, как гарантируют, будет присутствовать в каждом приложении, таким образом, это часто используется для установки структур исходных данных приложения.

Документы и объекты модели данных

Объекты модели данных хранят содержание Вашего приложения и являются определенными для Вашего приложения. Например, банковское приложение могло бы сохранить базу данных, содержащую финансовые транзакции, тогда как приложение рисования могло бы сохранить объект изображения или даже последовательность команд рисования, приведших к созданию того изображения. (В последнем случае объект изображения является все еще объектом данных, потому что это - просто контейнер для данных изображения.)

Приложения могут также использовать объекты документа (пользовательские подклассы UIDocument) управлять некоторыми или всеми их объектами модели данных. Объекты документа не требуются, но предлагают удобный способ сгруппировать данные, принадлежащие единственного файла или пакета файла. Для получения дополнительной информации о документах, см. Основанное на документе Руководство по программированию Приложения для iOS.

Объекты контроллера представления

Объекты контроллера представления управляют представлением содержания Вашего приложения на экране. Контроллер представления управляет единственным представлением и его набором подпредставлений. Когда представлено, контроллер представления делает свои представления видимыми путем установки их в окне приложения.

UIViewController класс является базовым классом для всех объектов контроллера представления. Это обеспечивает функциональность по умолчанию для загрузки представлений, представляя их, поворачивая их в ответ на вращения устройства и несколько другого стандартного поведения системы. UIKit и другие платформы определяют дополнительные классы контроллера представления для реализации стандартных системных интерфейсов, таких как средство выбора изображения, интерфейс панели вкладок и интерфейс навигации.

Для получения дальнейшей информации о том, как использовать контроллеры представления, см. Руководство по программированию Контроллера Представления для iOS.

UIWindow объект

A UIWindow возразите координирует представление одного или более представлений об экране. Большинство приложений имеет только одно окно, представляющее содержание на основном экране, но приложения могут иметь дополнительное окно для содержания, выведенного на экран на внешнем дисплее.

Для изменения содержания приложения Вы используете контроллер представления для изменения представлений, выведенных на экран в соответствующем окне. Вы никогда не заменяете само окно.

В дополнение к хостингу представлений окна работают с UIApplication объект поставить события Вашим представлениям и контроллерам представления.

Объекты представления, объекты управления и расположенные на слое объекты

Представления и средства управления обеспечивают визуальное представление содержания Вашего приложения. Представление является объектом, рисующим содержание в определяемой прямоугольной области и реагирующим на события в той области. Средства управления являются специализированным типом представления, ответственного за реализацию знакомых интерфейсных объектов, таких как кнопки, текстовые поля и тумблеры.

Платформа UIKit обеспечивает стандартные представления для представления многих различных типов содержания. Можно также определить собственные представления путем разделения на подклассы UIView (или его потомки) непосредственно.

В дополнение к слиянию представлений и средств управления, приложения могут также включить Базовые Слои анимации в свое представление и управлять иерархиями. Расположенные на слое объекты являются фактически объектами данных, представляющими визуальное содержание. Представления используют расположенные на слое объекты интенсивно негласно для рендеринга их содержания. Можно также добавить пользовательские расположенные на слое объекты к интерфейсу для реализации сложных анимаций и других типов сложных визуальных эффектов.

Что различает, одно приложение для iOS от другого является данными, которыми оно управляет (и соответствующая бизнес-логика) и как оно представляет те данные пользователю. Большинство взаимодействий с объектами UIKit не определяет Ваше приложение, но помогает Вам совершенствовать его поведение. Например, методы Вашего делегата приложения сообщают, когда приложение изменяет состояния так, чтобы Ваш пользовательский код мог ответить соответственно.

Основной цикл выполнения

Основной цикл выполнения приложения обрабатывает все связанные с пользователем события. UIApplication объект устанавливает основной цикл выполнения во время запуска и использует его для обработки событий и обновлений дескриптора к основанным на представлении интерфейсам. Как имя предполагает, основной цикл выполнения выполняется на основном потоке приложения. Это поведение гарантирует, что связанные с пользователем события обрабатываются последовательно в порядке, в котором они были получены.

Рисунок 2-2 показывает архитектуру основного цикла выполнения и как пользовательские события приводят к мерам, принятым Вашим приложением. Поскольку пользователь взаимодействует с устройством, события, связанные с теми взаимодействиями, сгенерированы системой и поставлены приложению через специальный порт, установленный UIKit. События ставятся в очередь внутренне приложением и диспетчеризируются один за другим основному циклу выполнения для выполнения. UIApplication объект является первым объектом получить событие и принять решение относительно какой потребности быть сделанным. Сенсорное событие обычно диспетчеризируется объекту главного окна, поочередно диспетчеризирующему его представлению, в котором произошло касание. Другие события могли бы взять немного отличающиеся пути через различные объекты приложения.

  События Обработки рисунка 2-2 в основном цикле выполнения
Processing events in the main run loop

Много типов событий могут быть поставлены в приложении для iOS. Наиболее распространенные перечислены в Таблице 2-2. Многие из этих типов событий поставлены с помощью основного цикла выполнения приложения, но некоторые не. Некоторые события отправляются делегату, возражают или передаются блоку, который Вы обеспечиваете. Для получения информации о том, как обработать большинство типов событий — включая касание, дистанционное управление, движение, акселерометр, и гироскопические события — видят Руководство по Обработке событий для iOS.

Табличные 2-2  Общие типы событий для приложений для iOS

Тип события

Поставленный …

Примечания

Касание

Объект представления, в котором событие имело место

Представления являются объектами респондента. Любые сенсорные события, не обработанные представлением, передаются вниз цепочка респондента для обработки.

Дистанционное управление

События движения встряски

Первый объект респондента

События дистанционного управления для управления носителями, воспроизводят и сгенерированы наушниками и другими аксессуарами.

Акселерометр

Магнитометр

Гироскоп

Объект Вы определяете

События, связанные с акселерометром, магнитометром и аппаратными средствами гироскопа, поставлены объекту, который Вы определяете.

Расположение

Объект Вы определяете

Вы регистрируетесь для получения событий расположения с помощью Базовой платформы Расположения. Для получения дополнительной информации об использовании Базового Расположения см. Руководство по программированию Карт и Расположение.

Перерисовка

Представление, для которого нужно обновление

События перерисовки не включают объект-событие, но являются просто вызовами к представлению для рисования себя. Архитектура получения для iOS описана в Рисовании и Печати Руководства для iOS.

Некоторые события, такие как события сенсорного и дистанционного управления, обрабатываются объектами респондента Вашего приложения. Объекты респондента находятся везде в Вашем приложении. ( UIApplication объект, Ваши объекты представления и Ваши объекты контроллера представления являются всеми примерами объектов респондента.) События Most предназначаются для определенного объекта респондента, но могут быть переданы другим объектам респондента (через цепочку респондента) в случае необходимости для обработки события. Например, представление, не обрабатывающее событие, может передать событие своему суперпредставлению или контроллеру представления.

Сенсорные события, происходящие в средствах управления (таких как кнопки), обрабатываются по-другому, чем сенсорные события, происходящие во многих других типах представлений. Существует обычно только ограниченное количество взаимодействий, возможных с управлением, и таким образом, те взаимодействия переупакованы в сообщения действия и поставлены надлежащему целевому объекту. Этот шаблон разработки целевого действия упрощает использовать средства управления для инициирования выполнения пользовательского кода в приложении.

Режимы выполнения для приложений

В любой данный момент Ваше приложение находится в одном из состояний, перечисленных в Таблице 2-3. Система перемещает Ваше приложение в зависимости от государства в ответ на действия, происходящие по всей системе. Например, когда пользователь нажимает кнопку «Домой», телефонный вызов входит, или любое из нескольких других прерываний происходит, состояние изменения в настоящее время запущенных приложений в ответ. Рисунок 2-3 показывает пути, что приложение берет при перемещении в зависимости от государства.

Табличные 2-3  состояния Приложения

Состояние

Описание

Не выполнение

Приложение не было запущено или работало, но было завершено системой.

Неактивный

Приложение работает на переднем плане, но в настоящее время не получает события. (Это может выполнять другой код все же.) Приложение обычно остается в этом состоянии только кратко, поскольку это переходит к различному состоянию.

Активный

Приложение работает на переднем плане и получает события. Это - нормальный режим для приоритетных приложений.

Фон

Приложение в фоновом режиме и выполняющий код. Большинство приложений вводит это состояние кратко в их путь к тому, чтобы быть приостановленным. Однако приложение, запрашивающее дополнительное время выполнения, может остаться в этом состоянии сроком на время. Кроме того, приложение, запускаемое непосредственно в фон, вводит это состояние вместо неактивного состояния. Для получения информации о том, как выполнить код, в то время как в фоновом режиме, посмотрите Фоновое Выполнение.

Приостановленный

Приложение в фоновом режиме, но не выполняет код. Система перемещает приложения в это состояние автоматически и не уведомляет их прежде, чем сделать так. В то время как приостановлено, приложение остается в памяти, но не выполняет кода.

Когда условие низкой памяти происходит, система может произвести чистку приостановленных приложений без предварительного уведомления для создания большего количества пространства для приоритетного приложения.

  Изменения состояния рисунка 2-3 в приложении для iOS

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

Завершение приложения

Приложения должны быть подготовлены к завершению произойти в любое время и не должны ожидать, чтобы сохранить пользовательские данные или выполнить другие критические задачи. Инициируемое в систему завершение является нормальной частью жизненного цикла приложения. Система обычно завершает приложения так, чтобы она могла предъявить претензии в отношении памяти и создать место для других приложений, запускаемых пользователем, но система может также завершить приложения, неправильно себя ведущие или не отвечающие на события своевременно.

Приостановленные приложения не получают уведомления, когда они завершаются; система уничтожает процесс и предъявляет претензии в отношении соответствующей памяти. Если приложение в настоящее время работает в фоновом режиме и не приостановленное, системные вызовы applicationWillTerminate: из его приложения делегируют до завершения. Система не вызывает этот метод когда перезагрузки устройства.

В дополнение к системе, завершающей Ваше приложение, пользователь может завершить Ваше приложение явно с помощью многозадачного UI. Инициируемое пользователями завершение имеет тот же эффект как завершение приостановленного приложения. Процесс приложения уничтожается, и никакое уведомление не отправляется в приложение.

Потоки и параллелизм

Система создает основной поток Вашего приложения, и можно создать дополнительные потоки, по мере необходимости, для выполнения других задач. Для приложений для iOS предпочтительный метод должен использовать Grand Central Dispatch (GCD), объекты операции и другие интерфейсы асинхронного программирования вместо того, чтобы создать и управлять потоками самостоятельно. Технологии, такие как GCD позволяют Вам определить работу, которую Вы хотите выполнить и порядок, который Вы хотите выполнить в ней, но позволить системе решить, как лучше всего выполнить ту работу над доступным CPUs. Разрешение системе обработать управление потоком упрощает код, который Вы должны записать, упрощаете гарантировать правильность того кода и предлагаете лучшую общую производительность.

При размышлении о потоках и параллелизме, рассмотрите следующее:

Для получения дополнительной информации об использовании GCD и объектов операции для выполнения задач см. Руководство по программированию Параллелизма.