gpt4 book ai didi

iphone - UIImageJPEGRepresentation - 内存释放问题

转载 作者:行者123 更新时间:2023-12-03 19:07:30 28 4
gpt4 key购买 nike

在iPhone应用程序上,我需要通过邮件发送最大尺寸为300Ko的jpg(我不知道mail.app可以有的最大尺寸,但这是另一个问题)。为此,我尝试降低质量,直到获得低于 300Ko 的图像。

为了获得给我300Ko以下的jpg的质量(压缩级别)的良好值(value),我做了以下循环。它正在工作,但是每次执行循环时,尽管有“[tmpImage release];”,内存还是会增加我的jpg原始大小(700Ko)的大小。

float compressionLevel = 1.0f;
int size = 300001;
while (size > 300000) {
UIImage *tmpImage =[[UIImage alloc] initWithContentsOfFile:[self fullDocumentsPathForTheFile:@"imageToAnalyse.jpg"]];
size = [UIImageJPEGRepresentation(tmpImage, compressionLevel) length];
[tmpImage release];
//In the following line, the 0.001f decrement is choose just in order test the increase of the memory
//compressionLevel = compressionLevel - 0.001f;
NSLog(@"Compression: %f",compressionLevel);
}

关于如何摆脱它,或者为什么会发生这种情况,有什么想法吗?谢谢

最佳答案

至少,在循环的每次行程中分配和释放图像是没有意义的。它不应该泄漏内存,但这是不必要的,因此将 alloc/init 和release移出循环。

此外,UIImageJPEGRepresentation 返回的数据是自动释放的,因此它将一直保留,直到当前释放池耗尽(当您返回到主事件循环时)。考虑添加:

NSAutoreleasePool* p = [[NSAutoreleasePool alloc] init];

在循环的顶部,并且

[p drain] 

在最后。这样您就不会泄漏所有中间内存。

最后,对最佳压缩设置进行线性搜索可能效率很低。改为进行二分搜索。

关于iphone - UIImageJPEGRepresentation - 内存释放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2655769/

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