为什么在我的集合视图项的代表对象中没有调用dealloc?

时间:2014-01-09 05:52:43

标签: objective-c cocoa

我有一个简单的NSCollectionView,它直接来自Apple的指南。一些数据点:

  • 我的应用程序会在启动新任务时清空其集合视图,然后用项目填充它。
  • 我注意到反复运行相同的任务会导致内存使用量增长,而且Instruments告诉我新内存主要是集合视图中的NSView。
  • 如果我将项目复制到我的阵列控制器的内容数组中,则会在复制的实例上调用dealloc(如预期的那样)。
  • 我使用ARC

modified Apple's IconCollection sample code稍微说明了这个问题:

  • 添加了一个5秒计时器,用于刷新集合视图并重建其内容。
  • 为图标添加了一个简单的NSImage子类,实现了dealloc以记录其调用。

如果您在乐器中分析应用程序并在每次刷新后设置标记,您将会看到问题。

这到底是怎么回事?

更新

我原来的示例项目不是问题的一个很好的例子。我从头开始重新创建了一个示例文件,但我发现了问题的原因,但我并不完全理解为什么我的错误导致内容对象被保留。

错误的要点是我无意中将我的视图原型的ImageCell连接回Collection View Item的代表对象插座。

这是一个正确代表问题的sample project。如果你运行它,你会看到内存使用量稳步增长,你不会在控制台中看到任何dealloc消息。打开MainMenu.xib并将图像单元格中的错误引用删除到集合视图项,当您重新运行它时,它将表现正常。

2 个答案:

答案 0 :(得分:2)

使用imageNamed时,有一个缓存可以插入图像。正如文档所说的那样 - “可以从缓存中悄悄地删除对象”。注意“可能”。

每次都可以看到相同的对象:

NSLog(@"%p",[CustomImage imageNamed:NSImageNameBluetoothTemplate]);

答案 1 :(得分:0)

我发现了泄漏的原因并将其更新到我的问题但是又来了:

  

错误的要点是我无意中连接了ImageCell   我的视图原型回到了Collection View Item   代表对象出口。

上面链接的新样本项目清楚地证明了这个问题。