调整iOS中的图像大小 - 无法识别泄漏

时间:2014-07-12 16:22:05

标签: ios objective-c memory-leaks uiimage

我从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。这是仪器截图:

Instruments screenshot for <code>resizePhoto</code> running on iPhone 4S

仪器工具本身没有任何泄漏,但我不相信。它要么是for循环而不是放弃resizedImage,要么是因为某些事情与上下文有关(不确定)。

1 个答案:

答案 0 :(得分:1)

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

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

此外,您不需要将resizedImage设置为nil。图像是自动释放的(至少没有优化)。