1

スレッドで作成されたウィンドウが、スレッドの終了後も (ARC の下で) 生きている理由がわかりません。

これは次のように呼ばれます。

-(void)prefsWindow:(id)sender {
    NSRect frame = NSMakeRect(200, 200, 640, 480);
    NSWindow *window  = [[NSWindow alloc] initWithContentRect:frame
                                                    styleMask:NSTitledWindowMask | NSClosableWindowMask
                                                      backing:NSBackingStoreBuffered
                                                        defer:NO];
    [window center];
    [window makeKeyAndOrderFront:NSApp];
    [NSThread exit];
}

[NSThread detachNewThreadSelector:@selector(prefsWindow:) toTarget:self withObject:nil];

範囲外で死ぬと思います。ありがとうございました!

4

2 に答える 2

2

ウィンドウが作成されると、重要な AppKit がそれを参照する必要があります。これにより、特にウィンドウ マネージャーにそれを表すことができます。AppKit に参照が保持されている可能性があります。または、フレームワークによってまだ使用されているウィンドウを解放したばかりで、すぐにクラッシュが発生する可能性があります。

上記のコードからウィンドウ オブジェクトについてわかっていることの 1 つ、ウィンドウの所有権がなくなったことです

于 2013-03-20T13:24:02.863 に答える
2

ウィンドウはアプリケーション キー ウィンドウであるため、NSApp がまだ強い参照を保持しているため、まだ生きています。

ウィンドウが不要になったら close を呼び出します。

[window close];
于 2013-03-20T13:24:31.650 に答える