objective-c - IBOutlet 是一个 NSZombie?

标签 objective-c cocoa xib iboutlet nszombie

这是一个 OS X 应用程序。我正在设计一个定制表。在我的 XIB 文件中,我有工作表的窗口和 NSViewController 的子类,它负责控制窗口/工作表中的 View 。 XIB 的所有者是另一个 Controller 类。

我将一个 NSTextField 放入窗口的内容 View 中。在我的 NSViewController 中,我为 NSTextField 创建了一个 IBOutlet 声明,并确保导出在 XIB 中正确连接。

我覆盖了 -[NSViewController setRepresentedObject:] ,在该方法中,我正在查看representedObject,并根据它的属性,我要么从它的 super View 中删除 NSTextField,要么将其添加回 super View 中。

我第一次使用表示对象显示工作表,该对象指示应从 super View 中删除文本字段。这工作得很好。

第二次我使用representedObject显示工作表时,该对象指示应将文本字段添加回 super View ,在调用-[NSView addSubview:]时,我的应用程序因EXC_BAD_ACCESS而崩溃。

运行仪器显示,当我尝试将 NSTextField 添加回 super View 时,它是一个僵尸。 Instruments 还表明每次对保留/释放/自动释放的调用都是由 AppKit 或 Foundation 执行的 - 因此我的任何代码都不会增加或减少保留计数。事实上,在我的代码中引用 IBOutlet 的唯一两行是对 -[NSView removeFromSuperview] 和 -[NSView addSubview:] 的调用。

我做错了什么或者这是 OS X 中的错误吗?除非卸载 XIB,否则决不应该释放 IBOutlet。

最佳答案

很自然地,我在发布问题后两分钟就弄清楚了。

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

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

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

关于objective-c - IBOutlet 是一个 NSZombie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11169514/

相关文章:

ios - 在 NSArray 中改变 NSDictionary

objective-c - 邮件 : Application isn't running

ios - 在 Xcode 中构建项目时出错

iphone - 自定义 UITabBarController

ios - 以图形方式自定义 Parse 登录 View

ios - xcassets 中的所有图像,然后如何加载从我的包中的 Nib 引用的图像

objective-c - 如何更改scrollWheel : handler into a magnifyWithEvent: call?

ios - CL位置管理器 : Requesting higher permissions

objective-c - 用于从 Microsoft PowerPoint 演示文稿中提取数据的 Cocoa API

ios - 自定义 UITableViewCell 适用于模拟器但不适用于设备