0

这是一个 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。

4

1 回答 1

1

很自然,我在发布问题后 2 分钟就明白了。

我的 XIB 中实际上有 2 个文本字段,它们都具有与问题中描述的相同的行为。只有一个文本字段变成了 NSZombie,这让事情变得更加混乱。

好吧,当我设计 XIB 时,我放置了一个 NSTextField,对其进行配置,然后在拖动 NSTextField 时按住 Option 键复制它。我确实确保为复制的 NSTextField 正确设置了出口,但由于某种原因,对象保持不变。

解决方案是删除有问题的 NSTextField,然后从调色板中删除一个新的并以这种方式配置它。

于 2012-06-23T12:35:54.763 回答