objective-c - NSTableColumn 何时被释放?

标签 objective-c macos cocoa nstableview

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

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

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

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

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

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

相关代码遍历表的列,删除它们:

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

接口(interface)中有一个单独的变量定义:

IBOutlet NSTableColumn *myDocumentColumn;

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

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

最佳答案

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

创建 NSTableColumn 子类的实例后:

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

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

[myTableView addTableColumn:theColumn];

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

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

[theColumn release];

不这样做无疑是一个愚蠢的错误。正如肯·托马斯(Ken Thomases)指出的那样,泄密工具会在短时间内发现并诊断出问题。

关于objective-c - NSTableColumn 何时被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714473/

相关文章:

ios - Youtube iframe 未显示在 UIWebView 中

iphone - 录制音频和视频

objective-c - 为什么[self.property release]会导致静态分析器显示 "incorrect decrement of the reference count"错误?

objective-c - 来自不同类的 NSMutableArray 获取 Null

objective-c - 如何让 NSTextFinder 出现

objective-c - 有人能让我了解sortedArrayUsingFunction 的工作原理吗?

java - OSX 上 JVM 的 Zombie http.proxyHost 设置

java - Mac 笔记本电脑锁定时,终端上运行的 java 程序是否继续运行?

regex - 在 Mac OS X 上使用命令 find 扩展 POSIX 实用程序?

cocoa - 如何在NSScrollView中控制NSTableView的绘制?