为什么' loadWindow'当窗口'在这里工作没有按'吨?

时间:2014-06-19 22:20:18

标签: objective-c xcode macos

我能够通过一些试验和错误来解决我的问题,但我不确定它为什么会起作用。我有两个主要类 - 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;
}
...

我想知道为什么添加物业修复了一切。有人可以为我阐明这个吗?

1 个答案:

答案 0 :(得分:0)

在前两种情况下,对AboutWindowController对象的引用保存在局部变量中。当该局部变量超出范围时,ARC将释放该引用。如果这是最后一个引用,则取消分配窗口控制器,此时它将释放窗口。如果这是对窗口的最后一次引用,那么窗口将被取消分配并从屏幕中删除(可能在您有机会看到它之前)。

通过将引用分配给强实例变量,可以确保窗口控制器能够长时间保持不变以查看窗口。

当你打电话给-loadWindow时,我不确定为什么会这样。可能是-loadWindow在直接调用窗口(或控制器)时有效地泄漏了对窗口(或控制器)的引用(这是你不应该这样做的一个原因)。