【发布时间】:2013-12-22 13:27:31
【问题描述】:
我想我会很聪明,将一个 C++ 回调函数的地址存储在它的 NSTableView 的 NSTableColumn 中的每一列中。我将 NSTableColumn 子类化,并添加了一个指针作为实例数据。我实现了一个子类化的 -dealloc 来破坏该指针(当然还调用了 super dealloc)。
问题是,派生的 NSTableColumn 的 -dealloc 似乎不会在调用时被调用,例如在调用 [myNSTableView removeTableColumn:theColumn] 时。我猜这是一个内存管理问题——也许 NSTableColumn 是自动释放的?
当 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]];
在的接口中有一个单独的变量定义:
IBOutlet NSTableColumn *myDocumentColumn;
...指向我在 IB 中的子类 (MyNSTableColumn)。
(注意:基于单元格的表格 -- Mac OS)
【问题讨论】:
-
iOS? C++?您的标签似乎不正确
-
指向回调函数的指针不需要被销毁。它是函子(类似函数的对象)吗?此外,只要它最终被摧毁,为什么它很重要?如果您怀疑存在泄漏,请使用 Leaks 工具分析哪些代码过度保留或未充分释放。
-
theColumn的声明是什么?它是局部变量还是实例变量?设置它的代码行(如果有)是什么? -
“Cocoa 和 Cocoa Touch 之间存在巨大的重叠”这并不是一个 iOS 问题。
-
因此,您使用
alloc和init(WithIdentifier:) 创建了列。您在哪里释放或自动释放该列?
标签: objective-c macos cocoa nstableview