NSCollectionView内存问题

时间:2016-02-23 14:29:34

标签: objective-c macos cocoa

我的环境是Yosemite 10.10.5,Xcode 7.2使用ARC。

我有一个使用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分析应用程序时,我发现即使NSView计数保持为5,从.xib文件加载的顶级对象(CollectionViewItem)的数量也会增加。向下钻取向我显示每个多余视图的保留计数为2。 (每个视图有72个保留/释放/自动释放事件,我还没弄清楚哪个保留是个问题......我正在研究它。)

将我的timerFired:代码放入自动发布部分并没有帮助。特别是当CollectionViewItem消失时按钮的图像和按钮本身无效,同样没有改变,试图用空的视图替换其加载的视图。

我错过了什么?

- 更新 -

经过多次实验,我意识到这并不总是发生。它似乎与应用程序是否处理(鼠标?)事件有关。也就是说,如果我在应用程序运行时坐下来观看仪器,则内存会增加,如此处所述。如果我将应用程序带到前台(或者在前台移动鼠标时),则会清除对象的积压。

这不是一个解决方案,但它可能会启发一个。 :)

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。应用程序的内存占用量不断增加。调试后,我发现{Authorization: Basic XXXXXX}deinit中的NSCollectionView都被调用了,但是NSViewController单元被困在内存中并且没有被释放。内存中NSCollectionItem单元的不断增加极大地增加了应用程序的内存占用。

enter image description here

  

解决方案::使用自定义类创建NSCollectionItem时,默认情况下FileOwner设置为CustomClassName,清除已解决的问题   从内存中证明并释放的NSCollectionItem个单元格。

enter image description here