什么时候发布NSTableColumn?

时间:2013-12-21 01:33:34

标签: objective-c macos cocoa nstableview

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

问题是,在调用[myNSTableView removeTableColumn:theColumn]时,似乎没有调用派生的NSTableColumn的-dealloc。我猜它是一个内存管理问题 - 也许NSTableColumn是autorelease?

在删除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]];

在:

的界面中有一个SEPARATE变量定义
IBOutlet NSTableColumn *myDocumentColumn;

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

[myTableView addTableColumn:theColumn];

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

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

[theColumn release];

没有这样做肯定是一个愚蠢的错误。正如Ken Thomases指出的那样,泄漏工具将在短时间内捕获并诊断出问题。

相关问题