0

我有一个财产:

@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]; 之后)会导致错误的访问错误。

4

2 回答 2

0

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

于 2013-11-14T17:01:13.407 回答
0

你需要添加什么:

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

您收到 EXC_BAD_ACCESS 错误的原因是 窗口设置为在关闭时释放,在当前事件完成后向对象发送释放消息。对于 NSWindow 对象,默认是在关闭时释放。

于 2018-12-20T07:11:15.480 回答