pmo*_*man 9 xcode anonymous virtual-machine instruments ios
在Xcode and Instruments我看到UILabel (CALayer)使用大量的虚拟内存(匿名VM).我看到每个大约235 KB的虚拟内存UILabel.
我认为这可能是iOS 7.1或7.1.1的新问题.
这是预期的吗?
我创建了一个简单的程序,创建500 UILabels并Instruments显示115MB的内存使用.在大约1500个标签处,应用程序由OS终止.
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]];
}
Run Code Online (Sandbox Code Playgroud)
思考?
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];
}
Run Code Online (Sandbox Code Playgroud)
当报告这种事情(向 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];
}
Run Code Online (Sandbox Code Playgroud)
这导致应用程序在我的机器上使用 129MB。(无需使用 Instruments:Xcode 现在直接显示内存使用情况。)
我的第一反应是:“我想我并不觉得这非常令人惊讶。如果你将 更改frame为更小的矩形,则使用更少的内存。视图很昂贵!它们由位图支持。”
但是,如果将 UILabel 更改为普通 UIView,则仅使用 13MB。我认为这足以保证提交错误。
| 归档时间: |
|
| 查看次数: |
3508 次 |
| 最近记录: |