...问题
我之前使用过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一起使用,它可能与此有关吗?
答案 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。