UIViewController (init и initWithNibName) - PullRequest
       3

UIViewController (init и initWithNibName)

21 голосов
/ 30 января 2012

Хотите узнать больше о практических различиях между init и initWithNibName. Таким образом, ответы типа this предполагают, что лучше вызывать "initWithNibName" через "init".

  1. Существуют ли какие-либо обстоятельства, которые нам нужны для определения "init" и "initWithNibName" по-другому?
  2. Возможно ли, что любой Nib-файл необходимо загрузить более одного раза во время выполнения одной программы?
  3. Вопросы 1 и 2 взаимосвязаны?

Ответы [ 3 ]

31 голосов
/ 30 января 2012

Не лучше лучше вызывать initWithNibName: косвенно через init.Вы просто хотите позвонить initWithNibName: в какой-то момент.Вы можете сделать это внешне или внутренне.Некоторые люди думают, что лучше сделать это изнутри.На самом деле у меня есть класс «LayoutUtil», в котором я сохраняю вспомогательные методы, связанные с макетом, чтобы избежать многократного написания утомительного фрагмента кода, связанного с макетом.Вот мой код для загрузки UIViewController:

+ (id)loadController:(Class)classType {
    NSString *className = NSStringFromClass(classType);
    UIViewController *controller = [[classType alloc] initWithNibName:className bundle:nil];
    return controller;
}

И тогда я могу просто сделать:

MyViewController *c = [LayoutUtil loadController:[MyViewController class]];

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

- (id)ughhhh
{
   self = [super initWithNibName:@"Myview" bundle:nil];
   if (self != nil)
   {
   }
   return self;
}

Файл пера может определеннонужно загружать более одного раза.Каждый раз, когда вы вызываете initWithNibName на UIViewController, XIB должен быть загружен.Многие люди загружают UIViews, которые не принадлежат UIViewController, например:

[[NSBundle mainBundle] loadNibNamed:@"nameOfXIBFile" owner:self options:nil];

Каждый раз, когда вы вызываете эту функцию, вы будете загружать перо.

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

init и initWithNibName: связаны с тем, что initWithNibName: автоматически вызывает init для объекта.

11 голосов
/ 30 января 2012

Не лучше 'косвенно вызывать initWithNibName через init'.Вы должны использовать тот, который больше соответствует вашим потребностям.Сказать [[UIViewController alloc] init] - это все равно, что сказать [[UIViewController alloc] initWithNibName:nil bundle:nil], поэтому, если вы хотите передать аргументы, вы также можете использовать [[UIViewController alloc] init].

В ответ на свои вопросы:

  1. Вы можете определить init и initWithNibName:bundle: по-разному, если хотите.Вы можете определить только один из них.Например, UIImagePickerController определяет только init, и если вы попытаетесь отправить его initWithNibName:bundle:, он не будет работать должным образом.Или вы можете определить какой-то совершенно другой метод init....Например, UINavigationController определяет только initWithRootViewController:.Какие бы методы инициализации вы ни определяли, они должны в конечном итоге вызвать один из методов инициализации своего суперкласса.

  2. Да, кончик может быть загружен несколько раз.Если вы создаете несколько экземпляров одного и того же подкласса контроллера представления, вполне вероятно, что вы будете загружать один и тот же кончик несколько раз.Фактически, для одного экземпляра контроллера представления возможно загрузить его кончик несколько раз.Как?Если представление контроллера представления в настоящее время не отображается на экране, и системе не хватает памяти, система попросит контроллер представления освободить свое представление.Если впоследствии контроллеру представления необходимо вернуть свой вид на экран, он снова загрузит перо.

  3. Вопросы 1 и 2 не связаны.

2 голосов
/ 30 января 2012

Ответ на первый вопрос

В идеале каждый initWithNibName вызывает init внутренне, так что вам не нужно определять оба сценария в обычном случае, но вы можете, если View также загружен из loadView в одномcase и fron Nib, а также в другом случае из разных видов.

Ответ на второй вопрос

Каждый раз, когда в стек загружается представление, Nib загружается

Ответ на третий вопрос

Нет

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