这是OS X应用程序。我正在设计一张自定义表格。在我的XIB文件中,我有工作表的窗口和NSViewController的子类,它负责控制窗口/工作表中的视图。 XIB的所有者是另一个控制器类。
我将NSTextField放入窗口的内容视图中。在我的NSViewController中,我为NSTextField创建了一个IBOutlet声明,并确保插座在XIB中正确连接。
我覆盖 - [NSViewController setRepresentedObject:]并且在该方法中我正在查看representObject并根据它的属性我要么从它的超视图中删除NSTextField,要么我将它添加回superview。
我第一次使用表示文本字段的representObject显示我的工作表时应该从superview中删除。这很好用。
我第二次使用表示文本字段的representObject显示我的工作表时应该将其添加回superview我的应用程序在调用时会使用EXC_BAD_ACCESS崩溃 - [NSView addSubview:]。
正在运行的仪器显示NSTextField是一个Zombie,当时我试图将它添加回superview。仪器还表明每次调用保留/释放/自动释放都是由AppKit或Foundation执行的 - 所以我的任何代码都不会增加或减少保留计数。事实上,在我的代码中引用IBOutlet的唯一两行是调用 - [NSView removeFromSuperview]和 - [NSView addSubview:]。
我做错了什么或者这是OS X中的错误?除非卸载XIB,否则永远不应释放IBOutlet。
答案 0 :(得分:1)
很自然地,我在发布问题后的2分钟就知道了。
我的XIB中实际上有两个文本字段,它们的行为与问题中描述的相同。只有一个文本区域变成了一个让事情更加混乱的NSZombie。
当我设计XIB时,我放置了一个NSTextField,对其进行了配置,然后通过在拖动NSTextField时按住Option来复制它。我确实确保为复制的NSTextField正确设置插座,但由于某种原因,对象保持不变。
解决方法是删除有问题的NSTextField,然后从调色板中删除一个新的,并按照这种方式进行配置。