Ответ 1
-initWithNibName:bundle:
- назначенный инициализатор для UIViewController. Что-то должно в конечном итоге назвать это. Тем не менее, и, несмотря на примеры Apple (которые во многих случаях обеспечивают краткость над ремонтопригодностью), он никогда не должен вызываться извне самого контроллера представления.
Вы часто увидите такой код:
MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];
Я говорю, что это неверно. Он помещает в вызывающую программу детали реализации (имя NIB и тот факт, что NIB используется). Это нарушает инкапсуляцию. Правильный способ сделать это:
MYViewController *vc = [[MYViewController alloc] init];
Затем в MYViewController:
- (instancetype)init
{
self = [super initWithNibName:@"Myview" bundle:nil];
if (self != nil)
{
// Further initialization if needed
}
return self;
}
- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
NSAssert(NO, @"Initialize with -init");
return nil;
}
Это перемещает данные о реализации ключа обратно в объект и предотвращает случайное нарушение инкапсуляции вызывающих абонентов. Теперь, если вы измените имя NIB или перейдете к программной конструкции, вы исправите его в одном месте (в контроллере представления), а не в каждом месте, где используется контроллер вида.