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當方法完成。這裏是儀器截圖:
沒有從儀器工具泄漏本身,而是我不相信它。它可能是for循環,不會放棄resizedImage
,或者如果上下文發生了什麼(不確定)。
你能詳細說明爲什麼我需要把它放在'autoreleasepool'塊嗎? – p0lAris
圖像作爲自動釋放對象返回,但添加的池沒有機會耗盡,直到函數結束。你需要在像這樣的緊密循環中使用autorelease池,或者將方法重命名爲newResizedImage,以便ARC返回「擁有」對象(應該也有限定符,但我不記得它)。 –