我称之为'发布'而不是关闭'在NSWindow?

时间:2012-03-16 09:13:46

标签: objective-c cocoa

当我完成一个弹出的NSWindow时,我调用了以下几行代码:

if (imageDroppedActionPopup) {
    [[self window] removeChildWindow:imageDroppedActionPopup];
    [imageDroppedActionPopup orderOut:nil];
    [imageDroppedActionPopup close];
    imageDroppedActionPopup = nil;
}

我现在想知道我是否可以替换

[imageDroppedActionPopup close];

[imageDroppedActionPopup release];

它似乎工作正常。但我想知道它是否正确。

我这样做的原因是,如果我因某种原因使用close,应用程序焦点会回到主文档窗口,而不是当前的NSWindowController窗口,这是上面提到的弹出父窗口。

2 个答案:

答案 0 :(得分:2)

close从屏幕中删除窗口,release减少对象的保留计数器,可能会也可能不会导致它被释放。

它似乎有效,因为被解除分配意味着从屏幕上删除,但这些方法永远不会互相替换。即使您是唯一的所有者,您也永远无法确定release是否会导致立即释放(因此窗口也不会立即消失),因为窗口可能会被其他人临时保留。

当您需要关闭窗口时,请致电close。并且您必须严格按照内存管理规则在您保留,分配或复制的对象上调用release

考虑到将close替换为release不会导致崩溃,我认为您需要两者。

答案 1 :(得分:0)

您无需使用close。调用orderOut:将关闭窗口。您应该在将其作为子窗口删除之前执行此操作。这样可以防止您看到的窗口排序问题。

这样做:

if (imageDroppedActionPopup) 
{
    [imageDroppedActionPopup orderOut:nil];
    [[self window] removeChildWindow:imageDroppedActionPopup];
    [imageDroppedActionPopup release];
    imageDroppedActionPopup = nil;
}

请注意,在将其设置为release之前,我仍然在窗口上调用nil