initWithNibName如何工作?

时间:2012-10-15 18:50:08

标签: objective-c ios

我用来以编程方式创建我的视图,并开始使用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

3 个答案:

答案 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:的超类实现不受您的实现的影响,因此继续像往常一样。