我想我会很聪明,将与每列强关联的 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/