在iOS—中调整图像大小;无法诊断的泄漏
我从StackOverflow的答案中选择了以下代码:在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
+ (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];
}
}