我想我应该聪明地存储一个C++回调函数的地址,该函数与其NSTableView的NSTableColumn中的每一列都有很强的关联。我继承了NSTableColumn,并添加了一个指针作为实例数据。我实现了一个子类-dealloc,它销毁了那个指针(当然,还调用了超级dealloc)。
问题是,派生的NSTableColumn的-dealloc似乎从来没有被调用过,例如当myNSTableView removeTableColumn:theColumn被调用时。我猜是内存管理问题--也许NSTableColumn是自动释放的?
当NSTableColumn被移除时,我找不到任何其他的委托/通知。我必须子类化NSTableView的removeTableColumn来拦截列删除吗?
编辑:因为有些人想知道,这个“指针”指向从Boost的Signals2创建的C++类的一个实例。它提供了从C++模型到Objective-C++方法的信号/回调机制。需要删除指针,以便从模型的广播类中删除回调订阅。
EDIT2:关于theColumn的定义,创建如下,然后添加到表中:
MyNSTableColumn *theColumn = [MyNSTableColumn alloc :columnModelAsId];
并且有问题的代码遍历表的列,删除它们:
while([[compareTableView tableColumns] count] > fromWhichColumn) {
[compareTableView removeTableColumn:[[compareTableView tableColumns] lastObject]];在的接口中有一个单独的变量定义:
IBOutlet NSTableColumn *myDocumentColumn;...which指向IB中的子类(MyNSTableColumn)。
(注:基于单元格的表格-- Mac OS)
发布于 2013-12-22 10:45:18
彼得·霍西( Peter Hosey )更恰当地回答了这个问题,但如果其他人犯了与我相同的错误,我将补充一个完整的答案:
创建我的NSTableColumn子类的实例后:
MyNSTableColumn *theColumn = [[MyNSTableColumn alloc] initWithIdentifier:columnModelAsId];...and将其添加到我的表中:
[myTableView addTableColumn:theColumn];我发现在调用removeTableColumn时,我的子类的dealloc方法没有被调用。
正如Peter在上面(和下面)指出的,解决方案是,既然我创建了对象,我就必须释放它--即使NSTable取得了所有权/保留了theColumn。所以我需要在添加之后立即发布它:
[theColumn release];未能做到这一点肯定是一个愚蠢的错误。正如Ken Thomases指出的那样,泄漏工具可以在很短的时间内捕获并诊断问题。
https://stackoverflow.com/questions/20714473
复制相似问题