Подтвердить что ты не робот

Могу ли я потерять производительность, используя файлы .xib, чтобы предоставить графический интерфейс приложения iPhone?

Мне было интересно, есть ли разница между использованием файлов .xib для дизайна графического интерфейса и программным способом.

Как и в случае с компилятором, я бы предположил, что упущено соответствующее время.

Я не прав?

4b9b3361

Ответ 1

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

Я сделал несколько быстрых, грязных и крайне неформальных тестов, чтобы проверить это для себя, и вот что я нашел (обратите внимание, что приложение, которое я построил для тестов, было просто царапиной и не обязательно представляло собой "настоящую", приложение):

  • Время запуска было быстрее, когда начальный экран был ничком

  • Для всех последующих экранов производительность увеличивалась при кодировании пользовательского интерфейса вручную

Сначала это странно, но когда вы думаете об этом, возможно, это не так уж и странно.

Проблема с запуском меня смущает, но я предполагаю, что Apple, будучи Apple, и одержима временем запуска (в хорошем смысле, конечно), просто оптимизировала unarchiver телефона таким образом, что загрузка из архива (nib ) может быть быстрее, чем кодирование вручную.

Тем не менее, большинство людей пишут приложения, на которые не будут влиять какие-либо различия. Мои (снова: быстрые и грязные) тесты показали, что с холодного старта (вы еще не запускали приложение или некоторое время), приложение на основе nib последовательно загружало свой начальный экран примерно в два раза быстрее, чем ручной код версия. Хотя это звучит как большое дело, мы говорим всего несколько миллисекунд. Эта разница будет незаметна для пользователей. Для теплого старта (вы уже открыли и закрыли приложение) различия в времени запуска были намного меньше.

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

Плюс, потому что пользовательский интерфейс iPhone настолько специфичен, что iPhone (неожиданно!), кодирование пользовательских интерфейсов вручную не сложно, как при написании настольных приложений. Вы используете одни и те же компоненты интерфейса снова и снова - как только у вас это получилось, взломать пользовательский интерфейс в коде очень просто. У вас нет восьмимиллиардных виджетов на выбор, поскольку вы будете разрабатывать Windows/OS X/любое приложение. Консистенция iPhone делает ее самой простой платформой, с которой я развивался в возрасте, когда дело доходит до кодирования пользовательских интерфейсов.

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

В другой раз я всегда кодирую пользовательские интерфейсы вручную, когда я использую динамическую таблицу. Если я создаю статическую таблицу - тот, чьи ячейки в принципе никогда не изменятся - нибы в порядке. Для любого другого типа таблицы, и особенно тех, которые имеют, скажем, миниатюры и другие ресурсоемкие биты, элемент управления, который я получаю при кодировании вручную, позволяет получить производительность, которую вы не собираетесь получать с помощью ячеек таблицы на основе nib, Для этого вам нужно пропустить CocoaTouch и работать напрямую с CoreGraphics, но улучшения производительности, которые вы можете сделать, стоят каждой последней строки кода, которую вы должны писать. Примеры производительности таблицы из проектов, над которыми я работал, см. В Barnes and Noble Store (а не в ebook reader) и Style.com. Мы создали структуру для этих (и других) приложений, а секрет плавной прокрутки таблицы состоит в том, что мы никогда не использовали ячейки, загруженные из nib (это более сложное, чем это, но пропуски nibs были первым шагом к получению производительности, в этих приложениях).

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

Чтобы уточнить: если у вас есть приложение с пятью контроллерами представлений, вставьте каждый контроллер в свой собственный наконечник. Вы не хотите загружать что-либо, пока оно не понадобится. Есть исключения из этого, но это просто, как кодирование - если у вас достаточно времени, вы найдете повод сделать что-то "неправильным способом", но подход a-nib-for-each-screen - это то, как вы должны делайте это, если у вас нет веских оснований не делать этого.

Я оставлю его там - надеюсь, это немного помогает.

Просто помните:

  • Мое неофициальное сглаживание показало, что запуск был быстрее с помощью наконечника (до тех пор, пока вы держите наконечник как можно проще, сохраняя только то, что вам нужно).

  • После запуска производительность, казалось, улучшилась для пользовательских интерфейсов с ручным кодированием.

  • Если все сделано правильно, и если вы не пишете игру или что-то в этом роде, новички не должны приводить к ощутимым проблемам с производительностью.

  • По моему опыту, таблицы разные - это одно место, в котором я редко использую nibs.

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

  • Держите свои перья как можно проще - я не могу сказать этого достаточно. По возможности создайте нить для каждого экрана вашего приложения, а не набивайте весь пользовательский интерфейс приложения в один нить.

Ok. На этот раз остановимся.

Надеюсь, что это поможет:)

Ответ 2

Очень мало. Есть некоторые исключения. Например, если вы используете xib для загрузки изображения, которое входит в UITableViewCell, это может быть проблемой, поскольку UITableViews со многими ячейками чувствительны к временам загрузки. Однако для всех целей и целей не должно быть заметного повышения производительности.

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

Ответ 3

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