-initWithNibName:bundle:
是UIViewController的指定初始值设定项.最终应该有人会这样称呼它.也就是说,尽管苹果的例子(在许多情况下主张简洁而不是可维护性),但它永远不应该从视图控制器本身之外调用.
您经常会看到这样的代码:
MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];
我说这是不正确的.它将实现细节(NIB的名称以及甚至使用了NIB的事实)放入调用者.这 destruct 了封装.正确的方法是:
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;
}
这会将关键实现细节移回对象中,并防止调用方意外 destruct 封装.现在,如果更改NIB的名称,或者转到编程构造,则可以在一个位置(在视图控制器中)修复它,而不是在使用视图控制器的每个位置.