【问题标题】:Cocoa ARC: Remove window from memoryCocoa ARC:从内存中删除窗口
【发布时间】:2013-11-14 16:56:19
【问题描述】:

我有一个财产:

@property (strong, nonatomic) NSWindow *window;

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

启动函数像这样创建一个新窗口(部分代码):

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

停止功能像这样关闭窗口:

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

【问题讨论】:

  • 没有回溯,没有人可以帮助你。当然不是没有更多的上下文。

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


【解决方案1】:

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

【讨论】:

  • 谢谢,我做了更多测试,请查看我更新的问题(底部)。分配似乎不是问题。
【解决方案2】:

你需要补充什么:

_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.

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多