我有我加載通常的方式爲什麼我的筆尖窗口會立即關閉?
[NSBundle loadNibNamed:@"AuthorizationWindow" owner:self];
筆尖,我在屏幕上看到的窗口顯示的時間較短,使用的NSLog()我可以證實,-awakeFromNib叫,但我可以」弄清楚爲什麼窗戶不留在屏幕上。我有一點工作正常,但現在我不知道我改變了什麼,搞砸了。想從哪裏開始尋找?
我有我加載通常的方式爲什麼我的筆尖窗口會立即關閉?
[NSBundle loadNibNamed:@"AuthorizationWindow" owner:self];
筆尖,我在屏幕上看到的窗口顯示的時間較短,使用的NSLog()我可以證實,-awakeFromNib叫,但我可以」弄清楚爲什麼窗戶不留在屏幕上。我有一點工作正常,但現在我不知道我改變了什麼,搞砸了。想從哪裏開始尋找?
我猜你的窗口正在被釋放(或者如果在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的理由。
我會仔細看看您用來加載筆尖的對象(self
,在您提供的代碼中)。由於它是窗口的所有者,因此當該對象被釋放時窗口將被釋放。
原來,我啓用了GC,並做到了。將給窗口控制器方法一個去。謝謝。
在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爲我工作。