ARC和一个线程窗口

时间:2013-03-20 13:14:49

标签: objective-c automatic-ref-counting

我不明白为什么线程结束后(在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];

我希望它会因为超出范围而死亡。谢谢!

2 个答案:

答案 0 :(得分:2)

当创建窗口时,AppKit必须具有对它的引用,以便它可以将其表示给窗口管理器等。 AppKit可能有一个保留引用 - 或者您刚刚发布了一个框架仍在使用的窗口,以便很快发生崩溃。

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

答案 1 :(得分:2)

窗口仍处于活动状态,因为NSApp仍然拥有强大的引用,因为它是应用程序密钥窗口。

当您不再需要该窗口时,请致电关闭:

[window close];