当我完成一个弹出的NSWindow时,我调用了以下几行代码:
if (imageDroppedActionPopup) {
[[self window] removeChildWindow:imageDroppedActionPopup];
[imageDroppedActionPopup orderOut:nil];
[imageDroppedActionPopup close];
imageDroppedActionPopup = nil;
}
我现在想知道我是否可以替换
[imageDroppedActionPopup close];
与
[imageDroppedActionPopup release];
它似乎工作正常。但我想知道它是否正确。
我这样做的原因是,如果我因某种原因使用close,应用程序焦点会回到主文档窗口,而不是当前的NSWindowController窗口,这是上面提到的弹出父窗口。
答案 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
。