Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS—中调整图像大小;无法诊断的泄漏_Ios_Objective C_Memory Leaks_Uiimage - Fatal编程技术网

在iOS—中调整图像大小;无法诊断的泄漏

在iOS—中调整图像大小;无法诊断的泄漏,ios,objective-c,memory-leaks,uiimage,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 r

我从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);
}
该方法完成后,内存使用量会增加,然后下降到~1.5MB。以下是仪器屏幕截图:

调整照片大小在iPhone 4S上运行“>


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

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

    for (int i = 0; i < 50; i++) {
    @autoreleasepool {
            // resize photo
            UIImage *resizedImage = [UIImage resizeImageToOptimalSize:image];
        }
    }
for(int i=0;i<50;i++){
@自动释放池{
//调整照片大小
UIImage*resizedImage=[UIImage resizeImageToOptimalSize:image];
}
}

此外,您不需要将resizedImage设置为零。图像将自动删除(至少在没有优化的情况下).

你能详细解释一下为什么我需要把它放在
自动释放池
块中吗?图像作为自动释放对象返回,但它添加的池在函数结束之前没有机会耗尽。你需要像这样在紧密循环中使用自动释放池,或者将方法重命名为newResizedImage之类的东西,以便ARC返回“拥有的”对象(这个应该有限定符,但我不记得了)。
    for (int i = 0; i < 50; i++) {
    @autoreleasepool {
            // resize photo
            UIImage *resizedImage = [UIImage resizeImageToOptimalSize:image];
        }
    }