在Xcode and Instruments
中,我看到UILabel (CALayer)
使用了大量虚拟内存(匿名虚拟机)。我看到每个UILabel
大约有235 KB的虚拟内存。
我认为这可能是iOS 7.1或7.1.1的新问题。
这是预期的吗?
我创建了一个创建500 UILabels
的简单程序,Instruments
显示了115MB的内存使用量。在大约1500个标签处,应用程序由操作系统终止。
for (int i = 0; i < 500; i++)
{
index = (int)[self.items count];
index++;
frame = CGRectMake(10.0, 20, 300.0, 50.0);
UILabel *newLabel = [[UILabel alloc] initWithFrame:frame];
newLabel.text = [NSString stringWithFormat:@"This is text for label: %d", index];
newLabel.backgroundColor = [UIColor whiteColor];
[self.view addSubview:newLabel];
[self.items setObject:newLabel forKey:[NSNumber numberWithInteger:index]];
}
思想?
答案 0 :(得分:4)
UILabel,任何使用drawRect的视图(至少在iOS 7+上)都有纹理支持,因此每个UILabel都会占用大量内存,标签越大,使用的内存就越多。
我在You Doodle的照片编辑扩展程序中发现这个特别痛苦,它允许在照片应用中添加文字。不幸的是,我必须大大限制文本的缩放范围,因为照片扩展在崩溃之前比常规应用程序更受限于内存使用。
这可以通过运行仪器并分配一堆大型UILabel并设置其文本并确保它们全部可见来轻松验证,即:
CGRect f = CGRectMake(0.0.0f, 0.0f, 300.0f, 300.0f);
for (NSInteger i = 0; i < 100; i++)
{
UILabel* l = [[UILabel alloc] initWithFrame:f];
l.backgroundColor = UIColor.blueColor;
l.textColor = UIColor.whiteColor;
l.text = @"UILabel text for the memory test";
l.numberOfLines = 0;
[self.view addSubview:l];
}
答案 1 :(得分:3)
在报告此类事情时(对Stack Overflow或Apple),你真的应该消除不必要的多余代码。这段代码足以重现这种现象:
for (int i = 0; i < 500; i++)
{
CGRect frame = CGRectMake(10.0, 20, 300.0, 50.0);
UILabel *newLabel = [[UILabel alloc] initWithFrame:frame];
newLabel.backgroundColor = [UIColor whiteColor];
[self.view addSubview:newLabel];
}
这会导致应用在我的机器上使用129MB。 (无需使用仪器:Xcode现在直接显示内存使用情况。)
我的第一反应是:&#34;我想我不会发现这非常令人惊讶。如果将frame
更改为较小的rect,则使用较少的内存。意见很贵!它们由位图支持。&#34;
但是,如果将UILabel更改为普通UIView,则仅使用13MB。我认为这足以保证提交错误。