首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTableColumn什么时候发布?

NSTableColumn什么时候发布?
EN

Stack Overflow用户
提问于 2013-12-21 09:33:34
回答 1查看 81关注 0票数 0

我想我应该聪明地存储一个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];

并且有问题的代码遍历表的列,删除它们:

代码语言:javascript
复制
while([[compareTableView tableColumns] count] > fromWhichColumn) {
    [compareTableView removeTableColumn:[[compareTableView tableColumns] lastObject]];

在的接口中有一个单独的变量定义:

代码语言:javascript
复制
IBOutlet NSTableColumn *myDocumentColumn;

...which指向IB中的子类(MyNSTableColumn)。

(注:基于单元格的表格-- Mac OS)

EN

回答 1

Stack Overflow用户

发布于 2013-12-22 10:45:18

彼得·霍西( Peter Hosey )更恰当地回答了这个问题,但如果其他人犯了与我相同的错误,我将补充一个完整的答案:

创建我的NSTableColumn子类的实例后:

代码语言:javascript
复制
MyNSTableColumn *theColumn = [[MyNSTableColumn alloc] initWithIdentifier:columnModelAsId];

...and将其添加到我的表中:

代码语言:javascript
复制
[myTableView addTableColumn:theColumn];

我发现在调用removeTableColumn时,我的子类的dealloc方法没有被调用。

正如Peter在上面(和下面)指出的,解决方案是,既然我创建了对象,我就必须释放它--即使NSTable取得了所有权/保留了theColumn。所以我需要在添加之后立即发布它:

代码语言:javascript
复制
[theColumn release];

未能做到这一点肯定是一个愚蠢的错误。正如Ken Thomases指出的那样,泄漏工具可以在很短的时间内捕获并诊断问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20714473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档