3

我有一个包含许多动态项目的 NSMenu。这些项目是在 NSMenuDelegate 的 menuNeedsUpdate 方法中创建的,并且每个都分配有一个代表对象。我正在寻找修剪对象图,并希望通过删除所有动态项目(并在重新打开菜单时重新创建它们)来在关闭菜单时重新获得一些内存。我遇到的问题是确切地知道应该在哪里以及如何处理。

该文档指出 NSMenu 的 menuDidClose 不是更新菜单内容的合适位置。我已经设置了一个通知来监听 NSMenuDidEndTrackingNotification 并在此时通过调用我的 NSMenu 的 removeItem: 方法来删​​除动态项目。这是处理这种情况的正确方法吗?

最后,我可以保证在 NSMenuItem 上调用 removeItem 将正确地取消任何可能分配给它的自定义视图以及任何子菜单吗?

4

1 回答 1

1

我最近遇到了这个问题。你是绝对正确的。menuDidClose:不是删除菜单项的地方。我试过了,但它导致无法从菜单项发送操作方法。据我所知,我发现正确的解决方案是使用NSMenuDidEndTrackingNotification通知。它也很好用。

removeItem的,应该释放菜单项。如果您有一些自定义NSMenuItem子类,您在其中显式分配了一些视图,那么您当然必须根据dealloc需要实现该方法。如果您正在使用垃圾收集,则根本不必担心这一点。在任何情况下,您都应该始终使用 Instruments 来确保您没有任何泄漏。

于 2011-07-30T15:52:37.170 回答