【问题标题】:Detecting when an NSView is dealloc'ed检测 NSView 何时被释放
【发布时间】:2009-07-28 09:02:09
【问题描述】:

有什么方法可以检测 NSView 何时会被释放?

原因是,我有一些简单的委托(例如处理 -control:textView:doCommandBySelector: 以允许输入返回/制表键的 NSTextField 委托)。我想把这个委托对象放在笔尖,连接 NSTextField 的委托连接并让它工作。

它确实有效,但是即使在它链接到的 NSTextField 被释放后,委托也不会被释放,因此委托对象会泄漏。

我希望委托对象能够检测 NSTextField 何时被释放,但我想不出任何方法来做到这一点,这让我不得不存储一个单独的链接到委托对象其他一些控制器并在某些时候手动释放它,这远远不够理想。有什么想法吗?

【问题讨论】:

    标签: objective-c cocoa memory-management object-lifetime


    【解决方案1】:

    我之前对此进行了很好的了解,但似乎没有任何方法可以观察对象何时被释放。我已经在弱指针类中看到了一种方法,但它涉及到 isa swizzling,这可能会让人讨厌。这是网站:http://www.cocoadev.com/index.pl?WeakPointers

    从 nib 文件创建的对象应该在 nib 的所有者被释放时被释放,除非它们被保留在其他地方。例如,当一个 NSWindowController 被释放时,它将释放所有在加载 nib 时创建的对象。如果您的委托对象没有被释放,可能是因为它们被保留在其他地方,或者存在保留周期。

    【讨论】:

    • 问题是我不想向每个控制器添加代码来了解和删除这个特定于 NSTextField 的委托,否则它不会与之交互。我的解决方案是使用带有 5 (ick) IBOutlet ivars releaseOnDealloc1..5 的超类控制器。在超类中,dealloc 对每个 ivars 调用 release。然后在 Interface Builder 中,对于每个视图,我只是将无关的对象连接到各种 releaseOnDealloc 出口,以便在适当的时间释放它们。有点难看,但只需最少的代码/工作即可有效。
    猜你喜欢
    • 2019-08-09
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多