1

根据 Apple 的文档,初始化 NSWindowController 子类的推荐方法是调用 init() 而不是 initWithWindowNibName()。文档继续说,由于 NSWindowController 可能只适用于它设计的 nib,然后让子类调用 super initWithWindowNibName,如果任何 initWithWindowNib... 方法是,子类应该记录一个错误叫。

所以这就是我写的:

- (id) init
{
    NSLog(@"init()");
    return [super initWithWindowNibName:@"MyDocument"];
}

- (id) initWithWindowNibName:(NSString *)windowNibName
{
    NSLog(@"error...use init() instead");
    return nil;
}

- (id) initWithWindowNibName:(NSString *)windowNibName owner:(id)owner
{
    NSLog(@"error...use init() instead");
    return nil;
}

- (id) initWithWindowNibPath:(NSString *)windowNibPath owner:(id)owner
{
    NSLog(@"error...use init() instead");
    return nil;
}

当它运行时,我看到输出:

init()
error...use init() instead

所以……嗯?这是怎么回事?

有一个关于 init() 被调用两次的stackoverflow 问题,解决方法是一个实例是通过代码创建的,另一个是通过 nib 创建的。我的笔尖根本没有控制器对象。

4

1 回答 1

2

问题是这[super initWithWindowNibName:@"MyDocument"]只是一种方便的方法。它所做的只是调用[self initWithWindowNibName:@"MyDocument" owner:self]. 这当然会引发您的错误消息。您只需将init方法更改为:

- (id) init
{
    NSLog(@"init()");
    return [super initWithWindowNibName:@"MyDocument" owner:self];
}
于 2012-08-01T23:08:49.610 回答