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 有一个保留引用——或者你刚刚发布了一个仍在被框架使用的窗口,因此很快就会发生崩溃。

鉴于上面的代码,您对窗口对象了解的一件事是不再拥有窗口的所有权,而不是没有任何东西拥有它。

于 2013-03-20T13:24:02.863 回答
2

该窗口仍然存在,因为 NSApp 仍然持有对它的强引用,因为它是应用程序关键窗口。

当您不再需要该窗口时调用 close :

[window close];
于 2013-03-20T13:24:31.650 回答