Cocoa ARC:从内存中删除窗口

时间:2013-11-14 16:56:20

标签: objective-c cocoa automatic-ref-counting nswindow

我有一个属性:

@property (strong, nonatomic) NSWindow *window;

在我的实现中,我有两种方法,启动和停止。

start函数创建一个类似于(部分代码)的新窗口:

_window = [[NSWindow alloc] initWithContentRect:screenRect
                                           styleMask:NSBorderlessWindowMask
                                             backing:NSBackingStoreBuffered
                                               defer:NO];

stop函数关闭窗口,如下所示:

[_window orderOut:self];
[_window close];
//_window = nil;

然而,当我第二次执行启动功能时(开始,然后停止,然后再次启动),我收到EXC_BAD_ACCESS错误。

这发生在NSWindow alloc语句中。

我需要做些什么才能确保正确创建新窗口?

编辑:经过多次测试后,看来错误与alloc init调用无关。如果我在此之前添加以下行:

 NSLog(@"%@", _window);

在第一次调用start时,这将导致输出“null”,然后在调用stop()和新调用start之后,我将在NSLog行上得到一个EXC_BAD_ACCESS错误。

即使只设置_window = nil;在stop方法中(在调用[_window close];之后)导致错误的访问错误。

2 个答案:

答案 0 :(得分:0)

在分配对象时获得EXC_BAD_ACCESS很奇怪,检查错误是否在screenRect中

答案 1 :(得分:0)

您需要添加什么:

_window = [[NSWindow alloc] initWithContentRect:screenRect
                                           styleMask:NSBorderlessWindowMask
                                             backing:NSBackingStoreBuffered
                                               defer:NO];
[_window setReleasedWhenClosed:NO];

出现EXC_BAD_ACCESS错误的原因是 the window is set to be released when closed, a release message is sent to the object after the current event is completed. For an NSWindow object, the default is to be released on closing.