-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 или перейдете к программному построению, вы исправите его в одном месте (в контроллере представления), а не в каждом месте, где используется контроллер представления.