【问题标题】:Resizing an image in iOS — undiagnosable leak在 iOS 中调整图像大小 - 无法诊断的泄漏
【发布时间】:2014-07-12 16:22:05
【问题描述】:

我从 StackOverflow 上的答案中挑选了以下代码:

+ (UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)newSize;
{
    // UIGraphicsBeginImageContext(newSize);
    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
    // Pass 1.0 to force exact pixel size.

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 1.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

我将其用作UIImage 类型的类别。我正在使用以下方法对其进行分析:

+ (void)testResize:(UIImage *)image
{
    clock_t start = clock();
    int times = 50;
    for (int i = 0; i < 50; i++) {
        // resize photo
        UIImage *resizedImage = [UIImage resizeImageToOptimalSize:image];
        resizedImage = nil;
    }
    double diff = (double)clock()-start;
    printf("testResize = %f\n", diff * 1000/times/CLOCKS_PER_SEC);
}

如果我修改上面的代码并只转储resizeImageToOptimalSize 调用 50 次也没关系,我看到分析器发疯了。这是resizeImageToOptimalSize 代码,以防你怀疑我在这里犯了错误:

+ (UIImage *)resizeImageToOptimalSize:(UIImage *)image
{
    CGSize newSize = CGSizeMake(..., ...);
    return [self resizeImage:image toSize:newSize];
}

当方法完成时,内存使用量会增加并上升,然后下降到 ~ 1.5MB。这是仪器截图:

仪器工具本身没有泄漏,但我不相信。要么是 for 循环不放开 resizedImage,要么是上下文发生了什么事(不确定)。

【问题讨论】:

    标签: ios objective-c memory-leaks uiimage


    【解决方案1】:

    您需要在 for 循环中添加 @autoreleasepool。

        for (int i = 0; i < 50; i++) {
        @autoreleasepool {
                // resize photo
                UIImage *resizedImage = [UIImage resizeImageToOptimalSize:image];
            }
        }
    

    您也不需要将 resizedImage 设置为 nil。图片是自动发布的(至少没有优化)。

    【讨论】:

    • 你能详细说明为什么我需要把它放在autoreleasepool 块中吗?
    • 图像作为自动释放对象返回,但添加的池在函数结束之前没有机会耗尽。您需要在这样的紧密循环中使用自动释放池,或者将方法重命名为 newResizedImage 之类的东西,以便 ARC 返回“拥有”对象(应该也有限定符,但我不记得了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2012-10-09
    相关资源
    最近更新 更多