Apple のドキュメントによると、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
それで...え?どうしたの?
init() が 2 回呼び出されることについてのスタック オーバーフローの質問があります。解決策は、1 つのインスタンスがコードを介して作成され、もう 1 つのインスタンスが nib を介して作成されたことです。私のペン先にはコントローラーオブジェクトがまったくありません。