为什么笔尖的窗口立即关闭?

时间:2008-12-17 18:43:24

标签: objective-c cocoa

我有一个笔尖,我按常规方式加载

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

我看到屏幕上的窗口显示,并使用NSLog()我可以确认调用了-awakeFromNib,但我无法弄清楚为什么窗口不会停留在屏幕上。我有一点正常工作,但现在我不确定我改变了什么搞砸了。想从哪里开始寻找?

4 个答案:

答案 0 :(得分:3)

我猜你的窗口正在从你的下面被解除分配(或者如果在GC下收集的话)。有大约一百万个可能的原因(我们不能从一行代码中诊断出来),但事实上你只使用+ loadNibNamed:owner:是一个警告标志。原因是在nib中实例化的项遵循与Cocoa其余部分相同的内存管理规则;如果你想要它们,你必须保留它们(或者在GC中,保留它们的引用)。 NSWindowController(以及NSViewController)也有一些特殊的nib处理代码,因此它在加载时会保留其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的原因。

答案 1 :(得分:0)

我会仔细查看您用来加载nib(self的对象,在您提供的代码中)。由于它是窗口的所有者,因此在释放该对象时将释放该窗口。

答案 2 :(得分:0)

原来我已经启用了GC,并且做到了。会给窗口控制器方法一个去。感谢。

答案 3 :(得分:0)

在windowViewController头文件中输入:

@property (strong) NSWindowController *wc;

实施中: 在顶部合成wc

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

    return wc;
}

如果要使窗口可见:

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

这对我有用。