我有我加载通常的方式为什么我的笔尖窗口会立即关闭?
[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为我工作。