Подсказки по производительности

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

Сократите потребляемую мощность своего приложения

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

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

Чем больше данных, которые Вы передаете к сети, тем больше питания должно использоваться для выполнения радио. Фактически, доступ к сети является большинством интенсивных действий питания, которые можно выполнить. Можно минимизировать то время следующим эти инструкции:

Инструментальное приложение включает несколько инструментов для сбора связанной с питанием информации. Можно использовать эти инструменты, чтобы собрать общую информацию о потребляемой мощности и собрать определенные измерения для аппаратных средств, такие как Wi-Fi и радио Bluetooth, GPS-приемник, дисплей и CPU. Можно также позволить энергетической Диагностике, Входящей в систему устройство собрать информацию. Для получения информации об использовании Инструментов для сбора связанных с питанием данных см. Инструментальное Руководство пользователя. Для получения информации о том, как включить энергетическую Диагностику, Входящую в систему устройство, посмотрите Инструментальную Справку.

Используйте память эффективно

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

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

Наблюдайте предупреждения Низкой Памяти

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

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

Если Ваша модель данных включает известные purgeable ресурсы, Вы можете сделать, чтобы соответствующий менеджер возразил регистру для UIApplicationDidReceiveMemoryWarningNotification уведомление и удаляет сильные ссылки к своим purgeable ресурсам непосредственно. Обработка этого уведомления непосредственно избегает потребности направить все вызовы предупреждения памяти через делегата приложения.

Сократите объем потребляемой памяти своего приложения

Начинание с низким местом дает Вам больше комнаты для расширения Вашего приложения позже. Таблица 7-1 перечисляет некоторые подсказки относительно того, как сократить полный объем потребляемой памяти Вашего приложения.

Табличные 7-1  Подсказки для сокращения объема потребляемой памяти Вашего приложения

Подсказка

Действия для взятия

Устраните утечки памяти.

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

Сделайте файлы ресурсов как можно меньше.

Файлы находятся на диске, но должны быть загружены в память, прежде чем они смогут использоваться. Сожмите все файлы образа для создания их как можно меньше. (Для сжатия изображений PNG — предпочтительного формата изображения для приложений для iOS — используют pngcrush инструмент.) Можно сделать файлы списка свойств меньшими путем выписывания им в двоичном формате с помощью NSPropertyListSerialization класс.

Используйте Базовые Данные или SQLite для больших наборов данных.

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

Ресурсы загрузки лениво.

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

Выделите память мудро

Таблица 7-2 перечисляет подсказки для улучшения использования памяти в Вашем приложении.

Табличные 7-2  Подсказки для выделения памяти

Подсказка

Действия для взятия

Наложите пределы размера на ресурсы.

Избегите загружать большой файл ресурсов, когда меньший сделает. Вместо того, чтобы использовать изображение с высокой разрешающей способностью, используйте то, соответственно измеренное для основанных на iOS устройств. Если необходимо использовать большие файлы ресурсов, найдите способы загрузить только часть файла, в котором Вы нуждаетесь в любой момент времени. Например, вместо того, чтобы загрузить весь файл в память, используйте mmap и munmap функции для отображения частей файла в и из памяти. Для получения дополнительной информации об отображающихся файлах в память, см. Инструкции по Производительности Файловой системы.

Избегите неограниченных проблемных наборов.

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

Для получения дальнейшей информации о ARC и управлении памятью, посмотрите Переход к Информации о версии ARC.

Настройте свой сетевой код

Сетевой стек в iOS включает несколько интерфейсов для передачи по радио-аппаратным средствам устройств на iOS. Основной интерфейс программирования является платформой CFNetwork, создающей поверх сокетов BSD и непрозрачных типов в Базовой платформе Основы для передачи с сетевыми объектами. Можно также использовать NSStream классы в платформе Основы и низкоуровневых сокетах BSD найдены в уровне Core OS системы.

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

Подсказки для эффективных сетей

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

  • Для протоколов Вы управляете, определяете свои форматы данных, чтобы быть максимально компактными.

  • Избегайте использования болтливых протоколов.

  • Передайте пакеты данных в пакетах каждый раз, когда Вы можете.

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

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

Используя Wi-Fi

Если Ваше приложение получает доступ к сети с помощью радио Wi-Fi, необходимо уведомить систему того факта включением UIRequiresPersistentWiFi введите приложение Info.plist файл. Включение этого ключа позволяет системе знать, что это должно вывести на экран сетевое диалоговое окно выбора, если это обнаруживает какие-либо активные горячие точки Wi-Fi. Это также позволяет системе знать, что это не должно пытаться закрыть аппаратные средства Wi-Fi, в то время как работает Ваше приложение.

Чтобы препятствовать тому, чтобы аппаратные средства Wi-Fi использовали слишком много питания, iOS имеет встроенный таймер, выключающий аппаратные средства полностью после 30 минут, если никакое запущенное приложение не запросило свое использование через UIRequiresPersistentWiFi ключ. Если пользователь запускает приложение, включающее ключ, iOS эффективно отключает таймер на время жизненного цикла приложения. Как только то приложение выходит или приостановлено, однако, система повторно включает таймер.

Для получения дополнительной информации о UIRequiresPersistentWiFi ключ и ключи Info.plist файл, посмотрите информационный Файл Списка свойств.

Предупреждение авиарежима

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

  • Информационный список свойств Вашего приложения (Info.plist) файл содержит UIRequiresPersistentWiFi ключ и значение того ключа установлены в true.

  • В то время как устройство в настоящее время находится в авиарежиме, Ваше приложение запускается.

  • Wi-Fi на устройстве не был вручную повторно включен после переключателя к авиарежиму.

Улучшите свое управление файлами

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

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

Сделайте резервные копии приложения более эффективными

Когда пользователь синхронизирует устройство с iTunes, резервные копии происходят с помощью беспроводных технологий через iCloud или. Во время резервных копий файлы передаются с устройства на компьютер пользователя или учетную запись iCloud. Расположение файлов в Вашей тестовой среде приложения определяет, копируются ли те файлы и восстанавливаются. Если Ваше приложение создает много больших файлов, регулярно изменяющихся, и помещает их в расположение, копирующееся, резервные копии могли быть замедлены в результате. Поскольку Вы пишете свой код управления файлами, необходимо помнить этот факт.

Резервные методы наиболее успешной практики приложения

Вы не должны подготавливать свое приложение всегда к операциям восстановления и резервному копированию. Устройствам с активной учетной записью iCloud поддержали их данные приложения до iCloud в подходящее время. Для устройств, включающихся в компьютер, iTunes выполняет инкрементное резервное копирование файлов данных приложения. Однако iCloud и iTunes не копируют содержание следующих каталогов:

  • <Application_Home>/AppName.app

  • <Application_Data>/Library/Caches

  • <Application_Data>/tmp

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

  • Критические данные должны храниться в <Application_Data>/Documents каталог. Критические данные являются любыми данными, которые не могут быть воссозданы Вашим приложением, таким как пользовательские документы и другое сгенерированное пользователями содержание.

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

    • В iOS 5.1 и позже, сохраните файлы поддержки в <Application_Data>/Library/Application Support каталог и добавляет NSURLIsExcludedFromBackupKey припишите соответствию NSURL объект с помощью setResourceValue:forKey:error: метод. (При использовании Базовой Основы добавьте kCFURLIsExcludedFromBackupKey ключ к Вашему CFURLRef объект с помощью CFURLSetResourcePropertyForKey функция.) Применение этого атрибута препятствует тому, чтобы файлы были поддержаны до iTunes или iCloud. Если у Вас есть большое количество файлов поддержки, можно сохранить их в пользовательском подкаталоге и применить расширенный атрибут только к каталогу.

    • В iOS 5.0 и ранее, сохраните файлы поддержки в <Application_Data>/Library/Caches каталог, чтобы препятствовать тому, чтобы они были скопированы. При предназначении для iOS 5.0.1 посмотрите, Как я препятствую тому, чтобы файлы были поддержаны до iCloud и iTunes? для получения информации о том, как исключить файлы из резервных копий.

  • Кэшированные данные должны быть сохранены в <Application_Data>/Library/Caches каталог. Примеры файлов необходимо вставить Caches каталог включает (но не ограничиваются), файлы кэша базы данных и загружаемое содержание, такие как используемый журналом, газетой и приложениями карты. Ваше приложение должно быть в состоянии корректно обработать ситуации, где кэшированные данные удалены системой для высвобождения дискового пространства.

  • Временные данные должны храниться в <Application_Data>/tmp каталог. Временные данные включают любые данные, которые Вы не должны сохранять в течение длительного периода времени. Не забудьте удалять те файлы, когда Вы сделаны с ними так, чтобы они не продолжали занимать место на устройстве пользователя.

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

Для дополнительного разъяснения о том, как необходимо использовать каталоги в приложении, см. Руководство по программированию Файловой системы.

Файлы, сохраненные во время обновлений приложения

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

  • <Application_Data>/Documents

  • <Application_Data>/Library

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

Перемещение отделывается от основного потока

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

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

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