1

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 を介して作成されたことです。私のペン先にはコントローラーオブジェクトがまったくありません。

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 に答える