Разница в производительности: loadNibNamed и программно

У меня есть viewcontroller, который содержит много пользовательских UIViews. Пользовательский UIView, который я попытался определить, используя InterfaceBuilder (IB), и загрузить его в initWithFrame, используя этот код:

    NSArray *xib=[[NSBundle mainBundle] loadNibNamed:@"DayView" owner:self options:nil];

Контроллер представления вел себя крайне медленно, поэтому я решил попробовать загрузить элементы пользовательского интерфейса программно. Vòila, и скорость была увеличена примерно в 7 раз.

Почему разница между загрузкой файлов XIB и использованием "чистого" кода настолько велика? Моей первой гипотезой, о которой я мог подумать, было то, что IB задает много свойств по умолчанию, тогда как они просто равны нулю при определении их в коде. Но это не может объяснить огромную разницу в производительности! Я не нашел ни одного поста, который бы явно предупреждал вас против использования IB из соображений производительности.

Какие-нибудь мысли?

Спасибо!

РЕДАКТИРОВАТЬ: Я только что нашел эту ссылку и, следовательно, этот блог, который объясняет интересные вещи о том, когда файлы XIB загружаются с диска. Я думаю, что загрузка с диска объясняет разницу. /K

1 ответ

Вот кое-что, что я получил, а также нашел из моего опыта и Google.

=> I've done it both ways and here's my two sense:

Если ваша точка зрения относительно проста, и вы уверены, что она не будет сильно ее менять; затем Xib прочь. Если нет, то я рекомендую программно весь путь, потому что он имеет как минимум 3 больших преимущества:

1) Вы получаете более глубокие знания о том, как все работает за кулисами, что значительно помогает при отладке, если есть проблемы

2) Полный контроль и настройка всего, поэтому, если есть изменения, это легко реализовать

3) Менее запутанный; это может быть личным предпочтением, но если из кнопок вызывается много действий, и я нахожу, что стрелка строителя интерфейса зигзаг hullabaloo гораздо более запутанная, чем программно.

=> Прогрессивное определение управления - это более длительный процесс, чем при использовании XIB. Потому что, чтобы создать все элементы управления и позиции на лету.

=> Я также заметил, что файлы, связанные с загрузкой представления, программно используют примерно вдвое больше вторичной памяти, чем файлы XIB. Я не уверен, что это приводит к большему приложению, но это может быть что-то, чтобы рассмотреть в приложениях Lager

=> Я немного читал и думаю, что нашел что-то вроде заключения сделки в пользу программно. Оказывается, файлы Xib неявно используют метод imageNamed для загрузки своих изображений в память, которая обладает хорошо известной "функцией" кэширования, которая проблематична для памяти. Также я слышал, что IBOutlets являются серьезной проблемой управления памятью.

Все эти конструкторы интерфейсов являются очень хорошими инструментами, но если вы не знаете, что делаете, и не знаете, что эти инструменты делают, вы

1. на самом деле ничего не учат

2. может вызвать серьезные проблемы в вашем коде позже

и как только вы поймете, как все работает, вы можете использовать этих маленьких помощников...

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

Just found some usefull information/tips about xib:

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

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

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

Для основного файла пера вашего приложения включите только строку меню (или, в случае приложения для iPhone, только главное окно).

Для файлов перьев документов в Mac OS X включите только окно документа и объекты (например, контроллеры), необходимые для отображения этого окна.

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

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

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

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

Другие вопросы по тегам