2013-03-20 87 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