【问题标题】:NSTableViewDataSource dealloc in objective-cNSTableViewDataSource在objective-c中的dealloc
【发布时间】:2011-04-12 22:19:23
【问题描述】:

我目前正在学习 Objective-c,目前正在使用 NSTableView 进行培训。

这是我的问题:

我已经通过 Interface Builder 将我的 tableview 链接到我的控制器,以便它有一个数据源,我已经在我的控制器中实现了 NSTableViewDataSource 协议,并且我已经实现了 -(NSInteger) numberOfRowsInTableView:-(id) tableView:objectValueForTableColumn:row: 方法。

我创建了一个原始业务类(“person”),并成功地将其内容显示到我的 NSTableView 中。

但是,我在我的 dealloc 方法中放了一些 NSLog 来查看内存是否被释放,似乎我的数组以及我的“人”实例永远不会被释放。

这是我在控制器中的 dealloc 代码:

-(void)dealloc
{
    NSLog(@"the array is about to be deleted. current retain : %d",[personnes retainCount]);

    [personnes release];
    [super dealloc];
}

在我的“人”类中

-(void) dealloc
{
    NSLog(@"%@ is about to be deleted. current retain : %d",[self prenom],[self retainCount]);

    [self->nom release];
    [self->prenom release];

    [super dealloc];
}

什么时候应该在应用程序生命周期中调用这些 dealloc?因为我希望它们会在窗口关闭时被调用,但它没有。

希望大家看得清楚,

谢谢:)

风筝。

【问题讨论】:

  • 那些-dealloc 方法永远不会被调用?
  • 你的应用只有这个视图吗?
  • 只是一些关于retainCount的建议。不要依赖它。 stackoverflow.com/questions/2020103/…
  • [self->nom release] 应该是 [nom release]
  • 这是我唯一的看法,是的。我的意思是我的 NStableView 只有默认窗口。并且从不调用 dealloc(当我关闭窗口时,应该是正确的情况,)

标签: objective-c cocoa macos nstableview dealloc


【解决方案1】:

我假设您永远不会释放拥有(唯一)窗口的窗口控制器对象。因此,nib 文件中的窗口控制器和每个顶级对象都会在整个应用程序生命周期中保留,包括窗口(及其视图)。

由于窗口控制器存在于整个应用程序生命周期中,它不会被释放,因此它的-dealloc 方法永远不会被调用。而且,由于控制器-dealloc 方法从未被调用,它的personnes 数组也不会被释放。

personnes 数组拥有它的元素。由于数组没有被释放,它的元素也没有被释放,因此相应类/实例的-dealloc 方法永远不会被调用。

【讨论】:

  • 好吧,我就是这么想的。但是最后还好吗?因为我从来没有自己保留过控制器(仅通过IBuilder将它链接到窗口)。那么内存最终是不会被释放的?
  • @kite 你是如何将它链接到窗口的(我假设你指的是window 出口)?如果控制器在 MainMenu.nib 中实例化,则 @​​987654327@ 拥有它以及该 nib 文件中的任何其他顶级对象。
  • @kite 应用程序完成时操作系统会回收内存。由于这是由操作系统在应用程序退出时自动完成的,因此运行时不会费心释放(并因此发送-dealloc 到)活动对象。
  • ctrl + 从窗口拖到控制器 --> 数据源。
  • @kite 请注意,当您在应用程序中实现“删除项目”功能并从 personnes 数组中删除对象时,您的 person 类 (Personne?) 的 -dealloc 方法将被调用。
【解决方案2】:

Don'teveruseretainCount。结果充其量是误导性的。如果你练习正确的内存管理实践,你会没事的。您是否有任何内存问题/崩溃?

【讨论】:

  • 一点也不,我只是想看看当我关闭我的窗口(这是我的应用程序的唯一窗口)时内存是如何释放的。即使不显示保留计数,也永远不会调用 dealloc
  • 感谢您的建议。通过一些研究,我发现它是在 Appkit/UiKit 应用程序中避免的。但它在控制台应用中仍然有价值吗?
  • @Kite 作为控制台应用程序不会改变任何事情。为了从保留计数中获取有用的信息,需要考虑几个因素,因此通常最好避免它们。如果您好奇,请考虑与 Cocoa 框架的交互如何改变保留计数,自动释放池如何(以及何时!)改变保留计数,常量对象的保留计数是多少,以及多线程代码如何影响保留计数。 ;-)
  • 所以最后他们给了我们控制整个内存管理的感觉,但并非完全如此(不像C/C++)^^。好吧,让我们只关心对象的所有权,当我会更多地使用这种语言时,我会看看这些点^^
  • 您可以控制您需要控制的一切。你从retainCount 得到的数字很有趣,但几乎完全没用。
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 2013-08-18
  • 2011-11-09
  • 2010-12-30
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多