我认为我会聪明并存储与其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)
答案 0 :(得分:1)
Peter Hosey(上图)更恰当地回答了这个问题,但如果其他人犯了同样的错误,我会添加一个完整的答案:
创建我的NSTableColumn子类的实例后:
MyNSTableColumn *theColumn = [[MyNSTableColumn alloc] initWithIdentifier:columnModelAsId];
...并将其添加到我的表格中:
[myTableView addTableColumn:theColumn];
我发现在调用removeTableColumn时没有调用我的子类'dealloc方法。
正如彼得在上面(以及下面)指出的那样,解决方案是,因为我创建了对象,我必须释放它 - 即使NSTable获得所有权/保留了theColumn。所以我需要在添加它之后立即发布它:
[theColumn release];
没有这样做肯定是一个愚蠢的错误。正如Ken Thomases指出的那样,泄漏工具将在短时间内捕获并诊断出问题。