gpt4 book ai didi

iPhone - 初始化图像最有效的内存方式?

转载 作者:行者123 更新时间:2023-12-03 19:08:53 25 4
gpt4 key购买 nike

我读到 imageNamed: 在尝试初始化图像时很糟糕。但那么最好的方法是什么?我正在使用 imageWithContentsOfFile: 并在我的资源文件夹中传递图像的路径

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"]

这个调用在 for 循环中进行了大约 30 次。

现在,当我使用 Instruments 运行我的应用程序时,我发现 NSString 消耗了大量内存来执行上面我们使用字符串文字 (@"jpg") 的操作Instruments 将负责的调用者显示为 [NSBundle mainBundle],当我使用该类型的字符串文字时,这又指向该行。

那么在不使用太多内存的情况下初始化图像的最有效方法是什么?

我将语句更改为

img = [UIImage imageWithContentsOfFile:[bndl pathForResource:fileName ofType:extn]]

哪里extn是静态的并初始化为 @"jpg"fileName for 循环的每次迭代都会发生变化。但即便如此,最大使用NSString是因为[NSBundle mainBundle][NSBundle pathForResource:OfType:]根据仪器。

最佳答案

我会避免在循环中使用自动释放的对象。如果 Instruments 报告 NSBundle pathForResource:ofType: 调用上有大量命中,我会将其中一些处理拉到循环之外。

我建议的实现如下所示:

NSString *resourcePath = [[[NSBundle mainBundle] resourcePath] retain];

for (int i = 0; i < 1000; ++i)
{
...

NSString *pathForImageFile = [resourcePath stringByAppendingPathComponent:fileName];
NSData *imageData = [[NSData alloc] initWithContentsOfFile:pathForImageFile];

UIImage *image = [[UIImage alloc] initWithData:imageData];
[imageData release];

...

[image release];
}

[resourcePath release];

您将积累一个自动释放的字符串(pathForImageFile),但这应该不会那么糟糕。您可以在循环内创建并释放自动释放池,但我建议最多每 10 或 100 次循环执行一次,而不是每次执行一次。另外,resourcePath 上的保留和释放可能是多余的,但我把它放在那里,以防您想在此处的某个地方使用自己的自动释放池。

关于iPhone - 初始化图像最有效的内存方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/806374/

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