根据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创建的。我的笔尖根本没有控制器对象。
答案 0 :(得分:2)
问题是[super initWithWindowNibName:@"MyDocument"]
只是一种方便的方法。它的作用就是致电[self initWithWindowNibName:@"MyDocument" owner:self]
。这当然会抛出您的错误消息。您只需将init
方法更改为:
- (id) init
{
NSLog(@"init()");
return [super initWithWindowNibName:@"MyDocument" owner:self];
}