Жизненный цикл приложения
Приложения являются сложным взаимодействием между Вашим пользовательским кодом и системными платформами. Системные платформы обеспечивают основную инфраструктуру, которую должны выполнить все приложения, и Вы обеспечиваете код, требуемый настроить ту инфраструктуру и дать приложению стиль, который Вы хотите. Чтобы сделать это эффективно, это помогает понять немного об инфраструктуре 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 используют архитектуру контроллера представления модели. Этот образец разделяет данные приложения и бизнес-логику от визуального представления тех данных. Эта архитектура крайне важна для создания приложений, которые могут работать на различных устройствах с различными размерами экрана.
Объект | Описание |
---|---|
| |
Делегат приложения объект | Делегат приложения является основой Вашего пользовательского кода. Этот объект работает в тандеме с |
Документы и объекты модели данных | Объекты модели данных хранят содержание Вашего приложения и являются определенными для Вашего приложения. Например, банковское приложение могло бы сохранить базу данных, содержащую финансовые транзакции, тогда как приложение рисования могло бы сохранить объект изображения или даже последовательность команд рисования, приведших к созданию того изображения. (В последнем случае объект изображения является все еще объектом данных, потому что это - просто контейнер для данных изображения.) Приложения могут также использовать объекты документа (пользовательские подклассы |
Объекты контроллера представления | Объекты контроллера представления управляют представлением содержания Вашего приложения на экране. Контроллер представления управляет единственным представлением и его набором подпредставлений. Когда представлено, контроллер представления делает свои представления видимыми путем установки их в окне приложения. Для получения дальнейшей информации о том, как использовать контроллеры представления, см. Руководство по программированию Контроллера Представления для iOS. |
| A Для изменения содержания приложения Вы используете контроллер представления для изменения представлений, выведенных на экран в соответствующем окне. Вы никогда не заменяете само окно. В дополнение к хостингу представлений окна работают с |
Объекты представления, объекты управления и расположенные на слое объекты | Представления и средства управления обеспечивают визуальное представление содержания Вашего приложения. Представление является объектом, рисующим содержание в определяемой прямоугольной области и реагирующим на события в той области. Средства управления являются специализированным типом представления, ответственного за реализацию знакомых интерфейсных объектов, таких как кнопки, текстовые поля и тумблеры. Платформа UIKit обеспечивает стандартные представления для представления многих различных типов содержания. Можно также определить собственные представления путем разделения на подклассы В дополнение к слиянию представлений и средств управления, приложения могут также включить Базовые Слои анимации в свое представление и управлять иерархиями. Расположенные на слое объекты являются фактически объектами данных, представляющими визуальное содержание. Представления используют расположенные на слое объекты интенсивно негласно для рендеринга их содержания. Можно также добавить пользовательские расположенные на слое объекты к интерфейсу для реализации сложных анимаций и других типов сложных визуальных эффектов. |
Что различает, одно приложение для iOS от другого является данными, которыми оно управляет (и соответствующая бизнес-логика) и как оно представляет те данные пользователю. Большинство взаимодействий с объектами UIKit не определяет Ваше приложение, но помогает Вам совершенствовать его поведение. Например, методы Вашего делегата приложения сообщают, когда приложение изменяет состояния так, чтобы Ваш пользовательский код мог ответить соответственно.
Основной цикл выполнения
Основной цикл выполнения приложения обрабатывает все связанные с пользователем события. UIApplication
объект устанавливает основной цикл выполнения во время запуска и использует его для обработки событий и обновлений дескриптора к основанным на представлении интерфейсам. Как имя предполагает, основной цикл выполнения выполняется на основном потоке приложения. Это поведение гарантирует, что связанные с пользователем события обрабатываются последовательно в порядке, в котором они были получены.
Рисунок 2-2 показывает архитектуру основного цикла выполнения и как пользовательские события приводят к мерам, принятым Вашим приложением. Поскольку пользователь взаимодействует с устройством, события, связанные с теми взаимодействиями, сгенерированы системой и поставлены приложению через специальный порт, установленный UIKit. События ставятся в очередь внутренне приложением и диспетчеризируются один за другим основному циклу выполнения для выполнения. UIApplication
объект является первым объектом получить событие и принять решение относительно какой потребности быть сделанным. Сенсорное событие обычно диспетчеризируется объекту главного окна, поочередно диспетчеризирующему его представлению, в котором произошло касание. Другие события могли бы взять немного отличающиеся пути через различные объекты приложения.
Много типов событий могут быть поставлены в приложении для iOS. Наиболее распространенные перечислены в Таблице 2-2. Многие из этих типов событий поставлены с помощью основного цикла выполнения приложения, но некоторые не. Некоторые события отправляются делегату, возражают или передаются блоку, который Вы обеспечиваете. Для получения информации о том, как обработать большинство типов событий — включая касание, дистанционное управление, движение, акселерометр, и гироскопические события — видят Руководство по Обработке событий для iOS.
Тип события | Поставленный … | Примечания |
---|---|---|
Касание | Объект представления, в котором событие имело место | Представления являются объектами респондента. Любые сенсорные события, не обработанные представлением, передаются вниз цепочка респондента для обработки. |
Дистанционное управление События движения встряски | Первый объект респондента | События дистанционного управления для управления носителями, воспроизводят и сгенерированы наушниками и другими аксессуарами. |
Акселерометр Магнитометр Гироскоп | Объект Вы определяете | События, связанные с акселерометром, магнитометром и аппаратными средствами гироскопа, поставлены объекту, который Вы определяете. |
Расположение | Объект Вы определяете | Вы регистрируетесь для получения событий расположения с помощью Базовой платформы Расположения. Для получения дополнительной информации об использовании Базового Расположения см. Руководство по программированию Карт и Расположение. |
Перерисовка | Представление, для которого нужно обновление | События перерисовки не включают объект-событие, но являются просто вызовами к представлению для рисования себя. Архитектура получения для iOS описана в Рисовании и Печати Руководства для iOS. |
Некоторые события, такие как события сенсорного и дистанционного управления, обрабатываются объектами респондента Вашего приложения. Объекты респондента находятся везде в Вашем приложении. ( UIApplication
объект, Ваши объекты представления и Ваши объекты контроллера представления являются всеми примерами объектов респондента.) События Most предназначаются для определенного объекта респондента, но могут быть переданы другим объектам респондента (через цепочку респондента) в случае необходимости для обработки события. Например, представление, не обрабатывающее событие, может передать событие своему суперпредставлению или контроллеру представления.
Сенсорные события, происходящие в средствах управления (таких как кнопки), обрабатываются по-другому, чем сенсорные события, происходящие во многих других типах представлений. Существует обычно только ограниченное количество взаимодействий, возможных с управлением, и таким образом, те взаимодействия переупакованы в сообщения действия и поставлены надлежащему целевому объекту. Этот шаблон разработки целевого действия упрощает использовать средства управления для инициирования выполнения пользовательского кода в приложении.
Режимы выполнения для приложений
В любой данный момент Ваше приложение находится в одном из состояний, перечисленных в Таблице 2-3. Система перемещает Ваше приложение в зависимости от государства в ответ на действия, происходящие по всей системе. Например, когда пользователь нажимает кнопку «Домой», телефонный вызов входит, или любое из нескольких других прерываний происходит, состояние изменения в настоящее время запущенных приложений в ответ. Рисунок 2-3 показывает пути, что приложение берет при перемещении в зависимости от государства.
Состояние | Описание |
---|---|
Не выполнение | Приложение не было запущено или работало, но было завершено системой. |
Неактивный | Приложение работает на переднем плане, но в настоящее время не получает события. (Это может выполнять другой код все же.) Приложение обычно остается в этом состоянии только кратко, поскольку это переходит к различному состоянию. |
Активный | Приложение работает на переднем плане и получает события. Это - нормальный режим для приоритетных приложений. |
Фон | Приложение в фоновом режиме и выполняющий код. Большинство приложений вводит это состояние кратко в их путь к тому, чтобы быть приостановленным. Однако приложение, запрашивающее дополнительное время выполнения, может остаться в этом состоянии сроком на время. Кроме того, приложение, запускаемое непосредственно в фон, вводит это состояние вместо неактивного состояния. Для получения информации о том, как выполнить код, в то время как в фоновом режиме, посмотрите Фоновое Выполнение. |
Приостановленный | Приложение в фоновом режиме, но не выполняет код. Система перемещает приложения в это состояние автоматически и не уведомляет их прежде, чем сделать так. В то время как приостановлено, приложение остается в памяти, но не выполняет кода. Когда условие низкой памяти происходит, система может произвести чистку приостановленных приложений без предварительного уведомления для создания большего количества пространства для приоритетного приложения. |
Большинство изменений состояния сопровождается соответствующим вызовом к методам Вашего делегата приложения объект. Эти методы являются Вашим шансом реагировать на изменения состояния надлежащим способом. Эти методы упоминаются ниже, вместе со сводкой того, как Вы могли бы использовать их.
application:willFinishLaunchingWithOptions:
— Этот метод является первым шансом Вашего приложения выполнить код во время запуска.application:didFinishLaunchingWithOptions:
— Этот метод позволяет Вам выполнять любую заключительную инициализацию, прежде чем Ваше приложение будет выведено на экран пользователю.applicationDidBecomeActive:
— Позволяет Вашему приложению знать, что оно собирается стать приоритетным приложением. Используйте этот метод для любой последней подготовки.applicationWillResignActive:
— Сообщает, что Ваше приложение переходит далеко от того, чтобы быть приоритетным приложением. Используйте этот метод для помещения приложения в состояние покоя.applicationDidEnterBackground:
— Сообщает, что Ваше приложение теперь работает в фоновом режиме и может быть приостановлено в любое время.applicationWillEnterForeground:
— Сообщает, что Ваше приложение перемещается из фона и назад в передний план, но что это еще не активно.applicationWillTerminate:
— Сообщает, что завершается Ваше приложение. Если Ваше приложение приостановлено, этот метод не вызывают.
Завершение приложения
Приложения должны быть подготовлены к завершению произойти в любое время и не должны ожидать, чтобы сохранить пользовательские данные или выполнить другие критические задачи. Инициируемое в систему завершение является нормальной частью жизненного цикла приложения. Система обычно завершает приложения так, чтобы она могла предъявить претензии в отношении памяти и создать место для других приложений, запускаемых пользователем, но система может также завершить приложения, неправильно себя ведущие или не отвечающие на события своевременно.
Приостановленные приложения не получают уведомления, когда они завершаются; система уничтожает процесс и предъявляет претензии в отношении соответствующей памяти. Если приложение в настоящее время работает в фоновом режиме и не приостановленное, системные вызовы applicationWillTerminate:
из его приложения делегируют до завершения. Система не вызывает этот метод когда перезагрузки устройства.
В дополнение к системе, завершающей Ваше приложение, пользователь может завершить Ваше приложение явно с помощью многозадачного UI. Инициируемое пользователями завершение имеет тот же эффект как завершение приостановленного приложения. Процесс приложения уничтожается, и никакое уведомление не отправляется в приложение.
Потоки и параллелизм
Система создает основной поток Вашего приложения, и можно создать дополнительные потоки, по мере необходимости, для выполнения других задач. Для приложений для iOS предпочтительный метод должен использовать Grand Central Dispatch (GCD), объекты операции и другие интерфейсы асинхронного программирования вместо того, чтобы создать и управлять потоками самостоятельно. Технологии, такие как GCD позволяют Вам определить работу, которую Вы хотите выполнить и порядок, который Вы хотите выполнить в ней, но позволить системе решить, как лучше всего выполнить ту работу над доступным CPUs. Разрешение системе обработать управление потоком упрощает код, который Вы должны записать, упрощаете гарантировать правильность того кода и предлагаете лучшую общую производительность.
При размышлении о потоках и параллелизме, рассмотрите следующее:
Представления включения работы, Базовая Анимация и много других классов UIKit обычно должны происходить на основном потоке приложения. Существуют некоторые исключения к этому правилу — например, основанные на изображении манипуляции могут часто происходить на фоновых потоках — но когда в сомнении, предположите, что работа должна произойти на основном потоке.
Длинные задачи (или потенциально задачи длины) должны всегда выполняться на фоновом потоке. Любые задачи, включающие доступ к сети, доступ к файлу или большую обработку объемов данных, должны все быть выполнены асинхронно с помощью GCD или объектов операции.
Во время запуска переместите задачи от основного потока, когда это возможно. Во время запуска Ваше приложение должно использовать доступное время для установки его пользовательского интерфейса как можно быстрее. Только задачи, способствующие установке пользовательского интерфейса, должны быть выполнены на основном потоке. Все другие задачи должны быть выполнены асинхронно с результатами, выведенными на экран пользователю, как только они готовы.
Для получения дополнительной информации об использовании GCD и объектов операции для выполнения задач см. Руководство по программированию Параллелизма.