ARC和一个线程窗口



我不明白为什么在线程中创建的窗口在线程结束后仍然活着(在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];

我希望它会死,因为它超出了作用域。谢谢你!

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

当你不再需要这个窗口时调用close:

[window close];

当窗口被创建时,AppKit必须有一个对它的引用,这样它就可以在其他事情中向窗口管理器表示它。很可能AppKit有一个保留引用——或者你刚刚释放了一个仍在被框架使用的窗口,所以很快就会发生崩溃。

根据上面的代码,你知道的关于窗口对象的一件事是不再拥有窗口的所有权,而不是没有拥有它的所有权。

相关内容

  • 没有找到相关文章

最新更新