第二次使用makeKeyAndOrderFront barfs ...(ARC?)

时间:2015-04-27 00:41:54

标签: objective-c macos cocoa

...问题

我之前使用过MainMenu.xib中的代码来管理windows:

-

if([olt_MainMenu_WINDOW isVisible]){
    [olt_MainMenu_WINDOW setReleasedWhenClosed:NO];
    [olt_MainMenu_WINDOW close];
}

......然后

if(olt_DoSomething_WINDOW == nil)
    if(![[NSBundle mainBundle] loadNibNamed:@"DoSomething" owner:self topLevelObjects:nil])
        NSBeep();
if(olt_DoSomething_WINDOW != nil)
    [olt_DoSomething_WINDOW makeKeyAndOrderFront:nil];

-

...然后在我的MainMenu.xib中返回我的窗口:

-

if([olt_DoSomething_WINDOW isVisible]){
    [olt_DoSomething_WINDOW setReleasedWhenClosed:NO];
    [olt_DoSomething_WINDOW close];
}

......然后

if(olt_MainMenu_WINDOW == nil)
    if(![[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:self topLevelObjects:nil])
        NSBeep();
if(olt_MainMenu_WINDOW != nil)
    [olt_MainMenu_WINDOW makeKeyAndOrderFront:nil];

-

但是如果我第二次尝试makeKeyAndOrderFront DoSomething窗口,它就会用exc_bad_access barfs(代码= 1 ......

我可以多次将MakeKeyAndOrderFront改为MainMenu而不是其他任何人。我错过了什么?

是,在窗口的“属性”检查器中未选中“关闭时释放”。这是我第一次将它与ARC一起使用,它可能与此有关吗?

1 个答案:

答案 0 :(得分:1)

根据reference for loadNibNamed:owner:topLevelObjects:,我猜你在doSomething笔尖中对IBOutlet顶级对象有一个弱NSWindow。由于您没有传递&myArray之类的内容而是使用topLevelObjects:nil,因此很明显"有必要通过使用IBOutlets保持对它们的强引用。 "

  

<强>讨论

     

与遗留方法不同,对象[ topLevelObjects-ed。]遵循标准的可可内存管理规则;有必要通过使用IBOutlets或保持对数组的引用来保持对它们的强引用,以防止取消分配nib内容。

     

对顶级对象的出口应该是强引用,以证明所有权并防止重新分配。

你需要:

@property (strong) IBOutlet NSWindow *olt_DoSomething_WINDOW;

...或以其他方式保持对窗口的强引用。 IBOutlets通常较弱,因为它们是超级视图保留的视图元素,您不需要控制器保留,但除非您明确创建,NSWindow此处没有保留所有者。因此,实际上您需要一个强大的IBOutlet。