这是一个 OS X 应用程序。我正在设计一个自定义工作表。在我的 XIB 文件中,我有工作表的窗口和 NSViewController 的子类,它负责控制窗口/工作表中的视图。XIB 的所有者是另一个控制器类。
我在窗口的内容视图中放置了一个 NSTextField。在我的 NSViewController 中,我为 NSTextField 创建了一个 IBOutlet 声明,并确保出口在 XIB 中正确连接。
我覆盖了 -[NSViewController setRepresentedObject:] 并在该方法中查看了代表对象,根据它的属性,我要么从它的超级视图中删除 NSTextField,要么将其添加回超级视图。
我第一次显示带有表示文本字段的代表对象的工作表应该从超级视图中删除。这工作得很好。
第二次显示带有表示文本字段的工作表时,我的应用程序在调用 -[NSView addSubview:] 时会因 EXC_BAD_ACCESS 而崩溃。
Running Instruments 显示 NSTextField 在我尝试将其添加回超级视图时是僵尸。Instruments 还表明,每次对保留/释放/自动释放的调用都是由 AppKit 或 Foundation 执行的——所以我的任何代码都不会增加或减少保留计数。事实上,在我的代码中引用 IBOutlet 的仅有两行是对 -[NSView removeFromSuperview] 和 -[NSView addSubview:] 的调用。
我做错了什么还是这是 OS X 中的错误?除非 XIB 被卸载,否则永远不应该释放 IBOutlet。