我的环境是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
消失时按钮的图像和按钮本身无效,同样没有改变,试图用空的视图替换其加载的视图。
我错过了什么?
- 更新 -
经过多次实验,我意识到这并不总是发生。它似乎与应用程序是否处理(鼠标?)事件有关。也就是说,如果我在应用程序运行时坐下来观看仪器,则内存会增加,如此处所述。如果我将应用程序带到前台(或者在前台移动鼠标时),则会清除对象的积压。
这不是一个解决方案,但它可能会启发一个。 :)