我能够通过一些试验和错误来解决我的问题,但我不确定它为什么会起作用。我有两个主要类 - AboutWindowController和MainView - 我无法加载AboutWindow笔尖。
这是一些不起作用的东西(在MainView.m中):
#import "MainView.h"
#import "AboutWindowController"
...
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
AboutWindowController *aboutWindowController = [[AboutWindowController alloc] initWithWindowNibName: @"AboutWindowController"];
[aboutWindowController window];
...
}
return self;
}
...
然而,这确实有效(使用loadWindow而不是window)
#import "MainView.h"
#import "AboutWindowController"
...
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
AboutWindowController *aboutWindowController = [[AboutWindowController alloc] initWithWindowNibName: @"AboutWindowController"];
[aboutWindowController loadWindow];
...
}
return self;
}
...
文档说我不应该调用loadWindow并且该窗口无论如何都要调用它,但窗口没有出现。在玩了一下后,我能够通过向实现文件添加属性来解决问题,如下所示:
#import "MainView.h"
#import "AboutWindowController.h"
@interface MainView
@property (strong, nonatomic) AboutWindowController *aboutWindowController;
@end
@implementation MainView
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
_aboutWindowController = [[AboutWindowController alloc] initWithWindowNibName: @"AboutWindowController"];
[_aboutWindowController window];
...
}
return self;
}
...
我想知道为什么添加物业修复了一切。有人可以为我阐明这个吗?
答案 0 :(得分:0)
在前两种情况下,对AboutWindowController
对象的引用保存在局部变量中。当该局部变量超出范围时,ARC将释放该引用。如果这是最后一个引用,则取消分配窗口控制器,此时它将释放窗口。如果这是对窗口的最后一次引用,那么窗口将被取消分配并从屏幕中删除(可能在您有机会看到它之前)。
通过将引用分配给强实例变量,可以确保窗口控制器能够长时间保持不变以查看窗口。
当你打电话给-loadWindow
时,我不确定为什么会这样。可能是-loadWindow
在直接调用窗口(或控制器)时有效地泄漏了对窗口(或控制器)的引用(这是你不应该这样做的一个原因)。