【问题标题】:UIImageJPEGRepresentation - memory release issueUIImageJPEGRepresentation - 内存释放问题
【发布时间】:2011-02-08 23:47:10
【问题描述】:

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

为了获得300Ko下给我的jpg质量(compressionLevel)的好值,我做了如下循环。 它正在工作,但是每次执行循环时,尽管有“[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);
} 

关于如何摆脱它或为什么会发生的任何想法? 谢谢

【问题讨论】:

    标签: iphone memory uiimage uiimagejpegrepresentation


    【解决方案1】:

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

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

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

    在循环的顶部,并且

    [p drain] 
    

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

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

    【讨论】:

    • 非常感谢。添加 NSAutoreleasePool 解决了这个问题。现在内存稳定了。我知道进行线性搜索根本没有效率。我不想夸大其词,但是进行二进制搜索是什么意思?再次感谢您快速而出色的回复
    • en.wikipedia.org/wiki/Binary_search_algorithm 基本上,从可能的压缩值范围的一端开始。在每一步,使新值等于最后一个测试值和压缩大小低于限制的最后一个值的平均值。
    • 当然,binary_search 更有效。我做了一个小测试:linear_search: Image size:249.764 Ko Takes:180.64s with 81 loops binary search: Image size:249.637 Ko Takes:22.94s with 11 loops 再次感谢。
    • 这是一个非常好的回应。我最近一直在查看有关内存管理的 SO 信息,特别是使用分配和泄漏工具来优化应用程序。并且关于块和 NSOperation- NSOperationQueue-heavy 代码。使用 NSAutoreleasePool 对我来说是一个新概念,而且肯定会产生重大影响。因此,对于在 SO 上花了很长时间才能找到的东西,这是一个很大的 +1。
    • 刚刚在 GCD 块中使用 UIImageJPEGRepresentation 遇到了这个问题。它在内部将“CG 光栅数据”气球化,直到整个代码块完成(或首先使您的应用程序崩溃)。使用 ARC,将您的 UIImageJPEGRepresentation 代码包装在一个自动释放池块中,例如 @autoreleasepool { //your code with UIImageJPEGRepresentation },它将在该自动释放池代码块之后释放 CG 栅格数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2010-10-03
    相关资源
    最近更新 更多