gpt4 book ai didi

objective-c - NSTableColumn 何时被释放?

转载 作者:行者123 更新时间:2023-12-03 17:52:53 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com