【问题标题】:ARC and a window by threadARC和线程窗口
【发布时间】:2013-03-20 13:14:49
【问题描述】:

我不明白为什么线程中创建的窗口在线程结束后仍然存在(在 ARC 下)?

这叫:

-(void)prefsWindow:(id)sender {
    NSRect frame = NSMakeRect(200, 200, 640, 480);
    NSWindow *window  = [[NSWindow alloc] initWithContentRect:frame
                                                    styleMask:NSTitledWindowMask | NSClosableWindowMask
                                                      backing:NSBackingStoreBuffered
                                                        defer:NO];
    [window center];
    [window makeKeyAndOrderFront:NSApp];
    [NSThread exit];
}

通过

[NSThread detachNewThreadSelector:@selector(prefsWindow:) toTarget:self withObject:nil];

我希望它会因为超出范围而死掉。谢谢!

【问题讨论】:

  • 与xcode无关,我编辑了问题。

标签: objective-c automatic-ref-counting


【解决方案1】:

该窗口仍然存在,因为 NSApp 仍然持有对它的强引用,因为它是应用程序关键窗口。

当您不再需要该窗口时调用 close:

[window close];

【讨论】:

  • 不客气。我必须不偏不倚:选择你更喜欢的一个:-)
【解决方案2】:

当创建窗口时,关键 AppKit 必须对它有一个引用,以便它可以将它表示给窗口管理器等等。很可能 AppKit 有一个保留引用——或者你刚刚释放了一个框架仍在使用的窗口,因此很快就会发生崩溃。

根据上面的代码,您对窗口对象的了解是,不再拥有窗口的所有权,而不是 nothing 拥有它的所有权。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    相关资源
    最近更新 更多