2014-07-12 24 views
0

我有下面的代碼從採摘的答案在計算器上:調整大小iOS中的圖像 - undiagnosable泄漏

+ (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

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

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

此外,您不需要將resizedImage設置爲零。圖像是自動發佈的(至少沒有優化)。

+0

你能詳細說明爲什麼我需要把它放在'autoreleasepool'塊嗎? – p0lAris

+0

圖像作爲自動釋放對象返回,但添加的池沒有機會耗盡,直到函數結束。你需要在像這樣的緊密循環中使用autorelease池,或者將方法重命名爲newResizedImage,以便ARC返回「擁有」對象(應該也有限定符,但我不記得它)。 –