初始化NSWindowController子类

时间:2012-08-01 22:30:28

标签: objective-c cocoa

根据Apple的documentation,初始化NSWindowController子类的推荐方法是调用init()而不是initWithWindowNibName()。文档继续说,因为NSWindowController很可能只使用它设计的nib,然后让子类调用超级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

所以...是吧?怎么回事?

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

1 个答案:

答案 0 :(得分:2)

问题是[super initWithWindowNibName:@"MyDocument"]只是一种方便的方法。它的作用就是致电[self initWithWindowNibName:@"MyDocument" owner:self]。这当然会抛出您的错误消息。您只需将init方法更改为:

即可解决此问题
- (id) init
{
    NSLog(@"init()");
    return [super initWithWindowNibName:@"MyDocument" owner:self];
}