gpt4 book ai didi

objective-c - 为什么我的 Nib 窗口立即关闭?

转载 作者:行者123 更新时间:2023-12-03 17:00:55 25 4
gpt4 key购买 nike

我有一个 Nib ,可以按照通常的方式加载

[NSBundle loadNibNamed:@"AuthorizationWindow"所有者:self];

我看到窗口短暂地显示在屏幕上,使用 NSLog() 我可以确认 -awakeFromNib 被调用,但我不明白为什么窗口没有留在屏幕上。我让它正常工作了一段时间,但现在我不确定我改变了什么,导致了它的困惑。考虑从哪里开始寻找?

最佳答案

我猜你的窗口正在从你的下面被释放(或者如果在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;
}

*它还有特殊的代码来处理绑定(bind)引起的保留循环,这些循环通常会导致它泄漏,这对于您自己编写来说要困难得多。使用 NSWindowController 的又一个理由。

关于objective-c - 为什么我的 Nib 窗口立即关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/375583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com