【发布时间】:2011-03-06 12:00:36
【问题描述】:
我最近才进入 iPhone 开发领域,但我仍在摸索中。在测试各种 CALayer 和 CATextLayer 行为时,我偶然发现了一些有趣的东西。
我创建了一个 iPhone 测试应用,它的视图中只有 2 个 UIButton。其中一个分别调用“allocateAutoReleasedLayers”函数和另一个“deallocateAutoReleasedLayers”。以下代码sn-ps代表函数体。
-(IBAction)allocateAutoReleasedLayers:(id)sender
{
for ( int i = 0; i < 500; ++i )
{
CALayer * layer = [ CALayer layer ];
[ master addSublayer: layer ];
}
}
-(IBAction)deallocateAutoReleasedLayers:(id)sender
{
master.sublayers = nil;
}
现在,测试的目的是了解 iOS 如何处理层自动释放。当使用“分配”分析器运行时,应用程序占用 646.452 字节的内存。在我点击“分配”按钮后,内存使用量上升到 719.228 字节来托管所有创建的 500 个空层,这没关系,因为当我点击“解除分配”按钮时,使用的内存回落到 656.732 字节(我猜想分配前和释放后使用的内存不匹配是 iOS 内部内存管理的结果。
有趣的部分发生在我将“分配”过程的一部分更改为创建 CATextLayers 而不是 CALayers 时。
-(IBAction)allocateAutoReleasedLayers:(id)sender
{
for ( int i = 0; i < 500; ++i )
{
NSString * layerString = [ [NSString alloc ] initWithFormat: @"1231" ];
CATextLayer * textLayer = [ CATextLayer layer ];
[ textLayer setString: layerString ];
[ textLayer setFrame: CGRectMake( 0, 0, 100, 200) ];
[ textLayer setFont: @"Helvetica-Bold" ];
[ textLayer setFontSize: 20 ];
[ master addSublayer: textLayer ];
[ layerString release ];
}
}
应用程序在分配之前从通常的 651.868 字节使用量开始,然后上升到使用的 2.13MB(我猜 CATextLayers 的内存使用量相当大),在解除分配时,内存回落到 950.372 字节。
现在,我的问题如下:在处理 CATextLayers 时,在分配之前和释放之后发生了哪些 300kB 差异的原因。我想我对 iOS 管理内存方式的误解可能是原因,但我使用的创建 CATextLayer 的方式与创建 CALayer 时使用的方式完全相同。
提前致谢并致以最诚挚的问候!
【问题讨论】:
标签: iphone objective-c ios memory calayer