我的环境是Yosemite 10.10.5和使用ARC的Xcode7.2。
我有一个使用NSCollectionView的应用程序,并且经历了持续的内存增长。我已经能够创建一个小示例来展示相同类型的行为。
我从一个具有集合视图属性的视图控制器开始。
@property (weak) IBOutlet NSCollectionView *collectionView;视图控制器为该视图设置原型单元。原型的.xib包含一个顶层视图,以及一个图像按钮作为其唯一的子视图。
- (void)viewDidLoad {
[super viewDidLoad];
[self.collectionView setItemPrototype:[[CollectionViewItem alloc] initWithNibName:@"CollectionViewItem"
bundle:nil]];
}我通过在视图出现时创建计时器并每两秒运行一次来模拟数据刷新。当计时器触发时,它将执行一个目标方法。
- (void)timerFired:(NSTimer *)aTimer {
NSMutableArray *dataItems = [NSMutableArray array];
for (int i = 0; i < 5; i++) {
CollectionDataItem *item = [[CollectionDataItem alloc] init];
[dataItems addObject:item];
}
[self.collectionView setContent:dataItems];
}CollectionViewItem的代码只是设置一个按钮图像。(我之所以这么做,是因为在最初的应用程序中,很多多余的内存都与图像创建有关。)
- (void)viewWillAppear {
[super viewWillAppear];
[self.theButton setImage:[[NSImage alloc] initWithContentsOfFile:@"/Users/pmills/Desktop/d20c9f20a50352593498c0e7633e3ae7.jpg"]];
}当我使用Instruments分析应用程序时,我看到从.xib文件加载的顶级对象(NSView)的数量增加了,即使CollectionViewItem计数保持在5。向下查看,我发现每个多余的视图都有两个保留计数。(每个视图有72个保留/释放/自动释放事件,我还没有弄清楚哪些保留是个问题……我正在努力。)
将我的timerFired:代码放在自动发布部分没有任何帮助。具体地说,当CollectionViewItem消失时,将按钮的图像和按钮本身置零也没有帮助,同样,试图用一个空的视图替换加载的视图也没有什么变化。
我遗漏了什么?
-更新--
经过多次实验,我意识到这种情况并不总是发生。它似乎与应用程序是否正在处理有关(鼠标?)事件。也就是说,如果我在应用程序运行时坐下来观看Instruments,则内存会按此处所述的方式增加。如果我将应用程序带到前台(或者在前台移动鼠标),积压的对象就会被清除。
这不是一个解决方案,但可能会启发一个解决方案。:)
发布于 2019-11-26 22:01:00
我也遇到了同样的问题。应用程序的内存占用不断增加。经过调试,我发现即使是NSCollectionView和NSViewController的deinit也在被调用,但是NSCollectionItem单元被搁置在内存中,并且没有被释放。内存中NSCollectionItem单元的不断增加极大地增加了应用程序的内存占用。

解决方案:当使用自定义类创建
NSCollectionItem时,FileOwner默认设置为CustomClassName,清除此选项将从内存中解决经过验证和释放的NSCollectionItem信元。

https://stackoverflow.com/questions/35580209
复制相似问题