我用来以编程方式创建我的视图,并开始使用XIB文件进行切换。我找到了这段代码:
-(id)init
{
self = [super initWithNibName:@"HelpViewController" bundle:nil];
if (self != nil) {
// further initialization needed
}
return self;
}
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
NSAssert(NO, @"Initialize with -init");
return nil;
}
它有效,但为什么?如果我遵循逻辑,initWithNibName返回nil并将其设置为self。所以,self现在为零,然后你在init结束时返回self。嗯,这意味着你回归自己,这是零。是吗?
另外,如果我想初始化一个NSArray,我应该把它放在那个init函数中?
感谢您的解释。
YKO
答案 0 :(得分:3)
因为init方法调用self = [ super initWithNibName ...]。所以你必须调用init方法来创建对象。如果使用initWithNibName,它将失败
对于Array,您应该在init方法
中初始化-(id)init
{
self = [super initWithNibName:@"HelpViewController" bundle:nil];
if (self != nil) {
// further initialization needed
myArray = [[NSMutableArray alloc] init];
}
return self;
}
答案 1 :(得分:1)
您正在查看两个不同的initWithNibName函数。
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
NSAssert(NO, @"Initialize with -init");
return nil;
}
上面的函数覆盖了initWithNibName的超类版本。它引发一个断言通知调用者使用init。
self = [super initWithNibName:@"HelpViewController" bundle:nil];
上面一行是调用initWithNibName的超类版本,它返回一个视图控制器。
如果你想初始化一个数组,你可以在“需要进一步初始化”注释的地方初始化它。
答案 2 :(得分:1)
它的工作原理是因为你调用-initWithNibName:bundle:on super(很可能是UIViewController),而不是self(你的UIViewController的子类)。如果您在self上调用initWithNibName:bundle,那么如果禁用了断言,则会触发断言或返回nil。 -initWithNibName:bundle:的超类实现不受您的实现的影响,因此继续像往常一样。