2008-12-17 87 views
1

我有我加載通常的方式爲什麼我的筆尖窗口會立即關閉?

[NSBundle loadNibNamed:@"AuthorizationWindow" owner:self];

筆尖,我在屏幕上看到的窗口顯示的時間較短,使用的NSLog()我可以證實,-awakeFromNib叫,但我可以」弄清楚爲什麼窗戶不留在屏幕上。我有一點工作正常,但現在我不知道我改變了什麼,搞砸了。想從哪裏開始尋找?

回答

3

我猜你的窗口正在被釋放(或者如果在GC下收集的話)。有大約一百萬個可能的原因(我們無法通過一行代碼來診斷),但僅僅使用了+ loadNibNamed這個事實:owner:是一個警告標誌。原因是在nib中實例化的項目遵循與Cocoa其餘部分相同的內存管理規則;如果你想讓他們堅持下去,你必須保留它們(或者在GC中,保留對它們的引用)。 NSWindowController(和NSViewController)也有一些特殊的nib處理代碼,所以它在加載時保留了它所有的頂級對象,這樣它們就會一直保持它*。但是,如果您不使用它,則必須手動完成所有操作。

真正的解決方案是:不要使用+ loadNibNamed:owner :.相反,創建一個NSWindowController子類,並建立了-init方法,像這樣:

@implementation AuthorizationWindowController 
- (id)init 
{ 
    self = [super initWithWindowNibName:@"AuthorizationWindow"]; 
    if (self == nil) return nil; 
    // any other initialization code 
    return self; 
} 

*它還具有特殊的代碼來處理綁定誘導保留通常會導致其泄漏週期,這是相當多的很難寫自己。還有一個使用NSWindowController的理由。

0

我會仔細看看您用來加載筆尖的對象(self,在您提供的代碼中)。由於它是窗口的所有者,因此當該對象被釋放時窗口將被釋放。

0

原來,我啓用了GC,並做到了。將給窗口控制器方法一個去。謝謝。

0

在windowViewController頭文件類型是:

@property (strong) NSWindowController *wc; 

實施:

- (IBAction)mnuNewImageClicked:(id)sender { 
    NewWindowController *ivc = [[NewWindowController alloc] init]; 
    [ivc showWindow:self]; 
} 

此:在頂

-(id)init{ 
    wc = [super initWithWindowNibName:@"NewWindowController"]; 
    if(wc == nil){ 
     return nil; 
    } 

    return wc; 
} 

當你想使窗口可見 合成WC爲我工作。

相關問題