gpt4 book ai didi

cocoa - NSOutlineView/NSTreeController 删除后未释放所有模型对象

转载 作者:行者123 更新时间:2023-12-03 16:22:10 24 4
gpt4 key购买 nike

我有一个非常基本的应用程序:一个带有绑定(bind)到 NSTreeControllerNSOutlineView 的窗口。大纲 View 显示一个简单的模型对象 (TCCard)。我添加了两个按钮,以便可以在大纲 View 中添加和删除模型对象。

查看 Instruments (Leaks) 中的应用程序,我可以看到在添加模型对象时会创建它们的新实例,但当我从大纲 View 中删除它们时,并非所有实例都会被释放。即使大纲 View 没有更多条目,我的模型对象的两个或三个实例也始终保持“事件”状态。

大纲 View 或树 Controller 是否在幕后进行一些缓存?代码如下:

#import "TCAppDelegate.h"

#import "TCCard.h"

@implementation TCAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
TCCard *first = [TCCard new];
first.title = @"First card";

// tree controller content is bound to self.cards:
self.cards = [@[first] mutableCopy];
}

- (IBAction)addCard:(id)sender;
{
TCCard *second = [TCCard new];
second.title = [NSString stringWithFormat:@"%ld card", self.cards.count];

[self.treeController addObject:second];
}

- (IBAction)deleteCard:(id)sender;
{
NSIndexPath *path = [NSIndexPath indexPathWithIndex:self.cards.count - 1];

[self.treeController setSelectionIndexPath:nil];

[self.treeController removeObjectAtArrangedObjectIndexPath:path];

// some model objects continue to live
}

@end

这是一个非常基本的示例。在我的真实应用程序中,这些模型对象非常“重”,有很多对其他对象的引用。我真的希望当它们从 View 中删除时将它们全部释放。

编辑:即使使用 Apple 的示例代码也可以重现此问题:https://developer.apple.com/library/mac/#samplecode/DragNDropOutlineView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008831

在 Instruments 中运行示例并搜索 SimpleNodeData。观察实例的数量,然后从示例应用程序中删除所有节点(通过上下文菜单)。

最佳答案

在方法 - (IBAction)addCard:(id)sender 中,您使用 [TCCard new] 分配新的 TCCard 对象,这会为您提供一个必须显式释放的对象。由于树 Controller 会保留您添加到其中的对象,因此您应该在调用[treeController addObject:]后释放它。像这样:

- (IBAction)addCard:(id)sender;
{
TCCard *second = [TCCard new];
second.title = [NSString stringWithFormat:@"%ld card", self.cards.count];
[self.treeController addObject:second];
[second release];
}

提示:使用 Xcode 中的“产品”>“分析”来检测将来此类错误。

关于cocoa - NSOutlineView/NSTreeController 删除后未释放所有模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16031660/

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