2008-12-17 95 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为我工作。