我有一个笔尖,我按常规方式加载
[NSBundle loadNibNamed:@"AuthorizationWindow" owner:self];
我看到屏幕上的窗口显示,并使用NSLog()我可以确认调用了-awakeFromNib,但我无法弄清楚为什么窗口不会停留在屏幕上。我有一点正常工作,但现在我不确定我改变了什么搞砸了。想从哪里开始寻找?
答案 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];
}
这对我有用。