UIViewController (init и initWithNibName)
Пожелайте узнать больше о практических различиях между init
и initWithNibName
. SO ответы, такие как , указывают на то, что лучше коснуться "initWithNibName
" косвенно через "init
".
- Существуют ли какие-либо обстоятельства, которые нам необходимо определить "init" и
"initWithNibName" по-другому?
- Возможно ли, что любой файл Nib должен быть загружен более одного раза
во время выполнения одной программы?
- Связаны ли вопросы 1 и 2?
Ответы
Ответ 1
Не лучше коснуться 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;
}
Файл nib определенно может быть загружен более одного раза. Каждый раз, когда вы вызываете initWithNibName в UIViewController, необходимо загружать xib. Многие люди загружают UIView, которые не принадлежат UIViewController, как это:
[[NSBundle mainBundle] loadNibNamed:@"nameOfXIBFile" owner:self options:nil];
Каждый раз, когда вы вызываете эту функцию, вы загружаете наконечник.
Существуют случаи, когда кеш может быть кеширован. Примером может служить UITableView - но представление таблицы реализует собственный кеш. Операционная система автоматически не выполняет кэширование.
init
и initWithNibName:
связаны тем, что initWithNibName:
автоматически вызывает init для объекта.
Ответ 2
Не лучше "initWithNibName" вызвать "косвенно" через "init". Вы должны использовать тот, который лучше подходит вашим потребностям. Высказывание [[UIViewController alloc] init]
в точности похоже на высказывание [[UIViewController alloc] initWithNibName:nil bundle:nil]
, поэтому, если это аргументы, которые вы хотите передать, вы также можете использовать [[UIViewController alloc] init]
.
Отвечая на ваши вопросы:
-
Вы можете определить init
и initWithNibName:bundle:
по-разному, если хотите. Вы можете определить только один из них. Например, UIImagePickerController
определяет только init
, и если вы попытаетесь отправить его initWithNibName:bundle:
, он не будет работать должным образом. Или вы можете определить какой-то совсем другой метод init...
. Например, UINavigationController
определяет только initWithRootViewController:
. Независимо от того, какие методы init вы определяете, необходимо в конечном итоге вызвать один из его методов суперкласса init.
-
Да, наконечник можно загружать несколько раз. Если вы создаете несколько экземпляров одного и того же подкласса контроллера, вероятно, вы будете загружать один и тот же nib несколько раз. Фактически, один экземпляр контроллера представления может загружать его nib несколько раз. Как? Если в настоящее время на экране не отображается вид контроллера контроллера, и система работает с низким объемом памяти, система попросит диспетчер представлений высвободить его представление. Если позже диспетчеру просмотра необходимо вернуть свой вид на экран, он снова загрузит пин.
-
Вопросы 1 и 2 не связаны.
Ответ 3
Ответ на первый вопрос
В идеале каждый initWithNibName
вызывает init
внутренне, поэтому вам не нужно определять оба в сценарии обычного случая, но вы можете, если View также загружен из loadView
в одном случае и fron Nib, а также в другом случае из разные взгляды.
Ответ второго вопроса
Everytime View вставляется в Stack Nib загружен
Ответ третьего вопроса
Нет