1

我曾经以编程方式创建我的视图,并开始使用 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 现在是 nil,然后你在 init 结束时返回 self。嗯,这意味着你返回 self ,它是 nil 。那正确吗?

另外,如果我想初始化一个 NSArray,我应该把它放在那个 init 函数的什么地方?

感谢您的解释。

伊科

4

3 回答 3

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;
}
于 2012-10-15T19:13:52.173 回答
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 的超类版本,它返回一个视图控制器。

如果你想初始化一个数组,你可以在“需要进一步初始化”注释的地方初始化它。

于 2012-10-15T19:11:30.910 回答
1

它之所以有效,是因为您在 super(很可能是 UIViewController)上调用 -initWithNibName:bundle:,而不是在 self(您的 UIViewController 的子类)上调用。如果您要在 self 上调用 initWithNibName:bundle,那么如果您禁用了断言,您将点击断言或返回 nil。-initWithNibName:bundle: 的超类实现不受您的实现影响,因此会继续正常运行。

于 2012-10-15T19:53:31.560 回答