【问题标题】:When is a NSTableColumn released?NSTableColumn 什么时候发布?
【发布时间】:2013-12-22 13:27:31
【问题描述】:

我想我会很聪明,将一个 C++ 回调函数的地址存储在它的 NSTableView 的 NSTableColumn 中的每一列中。我将 NSTableColumn 子类化,并添加了一个指针作为实例数据。我实现了一个子类化的 -dealloc 来破坏该指针(当然还调用了 super dealloc)。

问题是,派生的 NSTableColumn 的 -dealloc 似乎不会在调用时被调用,例如在调用 [myNSTableView removeTableColumn:theColumn] 时。我猜这是一个内存管理问题——也许 NSTableColumn 是自动释放的?

当 NSTableColumn 被删除时,我找不到任何其他委托/通知。我必须继承 NSTableView 的 removeTableColumn 才能拦截列删除吗?

编辑:因为有些人想知道,这个“指针”指向一个从 Boost 的 Signals2 创建的 C++ 类的实例。它提供了从 C++ 模型到 Objective-C++ 方法的信号/回调机制。需要删除指针,以便从模型的广播类中删除回调订阅。

EDIT2:关于theColumn的定义,如下创建,然后添加到表中:

MyNSTableColumn *theColumn = [[MyNSTableColumn alloc] initWithIdentifier:columnModelAsId];

并且有问题的代码会遍历表格的列,并删除它们:

while([[compareTableView tableColumns] count] > fromWhichColumn) {
    [compareTableView removeTableColumn:[[compareTableView tableColumns] lastObject]];

在的接口中有一个单独的变量定义:

IBOutlet NSTableColumn *myDocumentColumn;

...指向我在 IB 中的子类 (MyNSTableColumn)。

(注意:基于单元格的表格 -- Mac OS)

【问题讨论】:

  • iOS? C++?您的标签似乎不正确
  • 指向回调函数的指针不需要被销毁。它是函子(类似函数的对象)吗?此外,只要它最终被摧毁,为什么它很重要?如果您怀疑存在泄漏,请使用 Leaks 工具分析哪些代码过度保留或未充分释放。
  • theColumn 的声明是什么?它是局部变量还是实例变量?设置它的代码行(如果有)是什么?
  • “Cocoa 和 Cocoa Touch 之间存在巨大的重叠”这并不是一个 iOS 问题。
  • 因此,您使用allocinit(WithIdentifier:) 创建了列。您在哪里释放或自动释放该列?

标签: objective-c macos cocoa nstableview


【解决方案1】:

Peter Hosey(上图)更正确地回答了这个问题,但如果其他人犯了与我相同的错误,我会添加一个完整的答案:

创建我的 NSTableColumn 子类的实例后:

MyNSTableColumn *theColumn = [[MyNSTableColumn alloc] initWithIdentifier:columnModelAsId];

...并将其添加到我的表中:

[myTableView addTableColumn:theColumn];

我发现调用 removeTableColumn 时没有调用我的子类的 dealloc 方法。

正如彼得在上面(和下面)指出的那样,解决方案是因为我创建了对象,所以我必须释放它——即使 NSTable 取得了所有权/保留了 theColumn。所以我需要在添加后立即发布它:

[theColumn release];

不这样做肯定是一个愚蠢的错误。正如 Ken Thomases 指出的那样,Leaks 仪器会在短时间内发现并诊断出问题。

【讨论】:

  • 好吧,不管 NSTableView 要做什么,你都需要释放列;它自己的所有权仅意味着您可以选择在添加该列后立即或在dealloc 内发布该列。 NSTableView 将要做什么对你自己的义务没有影响;您需要完全释放它,因为您创建了它。
  • @PeterHosey -- 我现在明白了。我已经编辑了上述答案以反映您的观点。顺便说一句——喜欢你的网站。
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2019-05-15
  • 1970-01-01
  • 2010-12-04
  • 2010-11-18
相关资源
最近更新 更多