当子视图被销毁时,在NSView removeFromSuperviewWithoutNeedingDisplay之前调用了什么?

时间:2013-07-30 06:20:58

标签: cocoa nsview

我的AudioUnit插件出现崩溃(在Logic 9和Logic X下运行 - Mac OS X 10.8.4。在AU实验室中无法重现)

我的AudioUnit插件在单独的线程中执行绘制。 当插件GUI关闭时,AU插件会收到以下呼叫: NSView removeFromSuperviewWithoutNeedingDisplay 问题是,在使用此功能调用AU时启动OS X 10.8.4, 执行绘制的单独线程仍在运行。 但是,此时有些东西已经被破坏,所以我在尝试绘制时收到了一个openGL错误: 帧缓冲区操作无效(1286)。 这当然会导致下一个插件GUI绘图中的图形损坏,以及几次GUI打开和关闭尝试后的崩溃。

问题是: 1.在NSView removeFromSuperviewWithoutNeedingDisplay之前是否有可以实现的函数? 这样,我可以在Logic破坏视图之前在单独的线程中停止绘图。 如果没办法,你还有其他建议吗?也许每次尝试都要检查一下?

谢谢! 下进行。

1 个答案:

答案 0 :(得分:0)

removeFromSuperviewWithoutNeedingDisplay方法可能不是关闭subView UI的最佳点。

有两种选择:

  1. 订阅并回应插件主机窗口NSWindowWillClose通知。

  2. 当NSView方法 - (void)viewWillMoveToWindow:(NSWindow)w

  3. 时发生反应 使用w == nil调用

    (这基本上意味着视图将很快从窗口中删除)。

    在这两种情况下,都可以在关闭窗口或更改视图层次结构之前立即做出反应,因此仍然存在"正常" SubView的UI环境。