Ant*_*nko 48 iphone initialization objective-c uiviewcontroller
我何时应该使用init:,何时应该initWithNibName:bundle:在创建视图控制器时使用?
Rob*_*ier 137
-initWithNibName:bundle:是UIViewController的指定初始值设定项.有些事情最终应该称之为.尽管如此,尽管Apple的例子(在许多情况下有利于简洁性而不是可维护性),但它永远不应该从视图控制器本身外部调用.
您经常会看到如下代码:
MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];
Run Code Online (Sandbox Code Playgroud)
我说这是不正确的.它将实现细节(NIB的名称和甚至使用NIB的事实)放入调用者.这破坏了封装.正确的方法是:
MYViewController *vc = [[MYViewController alloc] init];
Run Code Online (Sandbox Code Playgroud)
然后,在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;
}
Run Code Online (Sandbox Code Playgroud)
这会将关键实现细节移回对象,并防止调用者意外破坏封装.现在,如果您更改NIB的名称或转移到编程构造,则可以将其固定在一个位置(在视图控制器中),而不是在每个使用视图控制器的位置.
如果您正在使用nib文件进行初始化,请使用initWithNibName!也就是说,您使用Interface Builder创建的文件.
如果您没有使用IB来布局视图,则可以使用init.
| 归档时间: |
|
| 查看次数: |
57843 次 |
| 最近记录: |