2013-03-20 42 views
1

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

我希望它死导致其超出范围。谢谢!

+0

无关的Xcode中,我编辑的问题。 – 2013-03-20 13:20:41

回答

2

该窗口仍然存在,因为NSApp仍然拥有强大的引用,因为它是应用程序密钥窗口。

调用Close,当你不想再窗口:

[window close]; 
+0

谢谢!我喜欢你和格雷厄姆的回答,不知道谁的答案喜欢...... – fw2601 2013-03-20 13:48:18

+0

不客气。我必须保持公正:选择你更喜欢的那个:-) – 2013-03-20 13:51:23

2

当窗口被创建时,AppKit必须有一个对它的引用,以便它可以将其代表窗口管理器等。 AppKit很可能有一个保留的引用 - 或者你刚刚发布了一个仍然被框架使用的窗口,这样很快就会发生崩溃。

你知道给上面的代码窗口对象的一件事是,你不再有窗口,而不是什么拥有它的所有权的所有权。

+0

谢谢!很好的解释... – fw2601 2013-03-20 13:47:56