gpt4 book ai didi

iphone - 解除分配后的 CATextLayer 内存残留

转载 作者:行者123 更新时间:2023-11-29 11:23:33 30 4
gpt4 key购买 nike

我最近才开始从事 iPhone 开发,而且我仍在寻找解决方案的过程中。在测试各种 CALayer 和 CATextLayer 行为时,我偶然发现了一些有趣的事情。

我创建了一个 iPhone 测试应用程序,它在一个 View 中只有 2 个 UIButtons。其中一个调用“allocateAutoReleasedLayers”函数,另一个调用“deallocateAutoReleasedLayers”。以下代码片段代表函数体。

-(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 如何处理图层自动释放。当使用“Allocations”分析器运行时,应用程序占用 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 管理内存的方式的误解可能是原因,但我使用了与我在 CALayer 创建中使用的完全相同的方式来创建 CATextLayer。

提前致谢并致以最诚挚的问候!

最佳答案

我已经在模拟器上运行了您的代码,但我看不到这种行为。以下是我执行的步骤:

1) 在“Allocations”工具下运行应用程序。
2) 等到它完全启动。
3) 标记堆 -> Heap(0)
4) a) 使用 allocateAutoReleasedLayers: 分配 CATextLayer 实例 b) 使用 deallocateAutoReleasedLayers 解除分配: c) 标记 Heap -> Heap(1)

操作 4 给了我们一个测试模式(Allocate-Deallocate-Mark heap),所以

5) ADM(2) -> 堆(2)
6) ADM(3) -> 堆(3)
7) ADM(4) -> 堆(4)
...

Heap(n) 和 Heap(n-1) 之间的差异在执行 ADM(n) 时约为 2K,而在执行 ADM(n+1) 时下降到 0.5-1k(这可能是因为框架重新创建了一些东西并发布旧版本,例如,我可以注意到 CGDataProvider 的这一点)。无论如何,Heap(n+1)-Heap(n) 中的内容包含一些不相关的内容,例如 CSEvent、UITouchData 等,这些内容很可能被分配用于处理按钮点击。

您是在设备上还是在模拟器上进行测试?您重复此 ADM 循环多少次?后续堆之间的差异内容是什么?这很有趣,因为 300k 对我来说似乎太多了。

关于iphone - 解除分配后的 CATextLayer 内存残留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5210330/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com