UILabel(CALayer)正在使用大量虚拟内存

时间:2014-05-13 01:47:51

标签: ios xcode virtual-machine instruments anonymous

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]];
}

思想?

2 个答案:

答案 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。我认为这足以保证提交错误。