我有一个非常基本的应用程序:一个NSOutlineView
绑定到NSTreeController
. 大纲视图显示一个简单的模型对象 ( TCCard
)。我添加了两个按钮,以便可以在大纲视图中添加和删除模型对象。
查看 Instruments (Leaks) 中的应用程序,我可以看到我的模型对象的新实例是在我添加它们时创建的,但当我从大纲视图中删除它们时,并不是所有实例都被释放。即使大纲视图没有更多条目,我的模型对象的两个或三个实例也始终保持“活动”状态。
大纲视图或树控制器是否在幕后进行一些缓存?下面的代码:
#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
这是一个非常基本的例子。在我的真实应用程序中,这些模型对象非常“沉重”,并有很多对其他对象的引用。我真的希望在将它们从视图中删除时将它们全部释放。
编辑:即使使用 Apple 的示例代码也可以重现此问题:https ://developer.apple.com/library/mac/#samplecode/DragNDropOutlineView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008831
在 Instruments 中的示例中运行并搜索SimpleNodeData
. 观察实例的数量,然后从示例应用程序中删除所有节点(通过上下文菜单)。