当我尝试在最多100张图像上执行离屏旋转时CIIImage泄漏

时间:2011-12-27 10:13:31

标签: ios rotation cgaffinetransform

当我使用以下方法(在ARC下)时,内存分配迅速增长到125 Mo以上。

我使用CGImage实现了它,但速度相当慢。

imageArray包含125 UIImage,大小为640x80。

-(void)rotateAndTransform{
int j=0; 
context = [CIContext contextWithOptions:nil];
for(UIImage* item in imageArray) 
{
CGImageRef intermed =[item CGImage];
CIImage *begin = [CIImage imageWithCGImage:intermed];
CGAffineTransform transform = CGAffineTransformMakeRotation(-M_PI/2);
CIImage *outputImage = [ begin imageByApplyingTransform:transform];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImg = [UIImage imageWithCGImage:cgimg];
CGImageRelease(cgimg);
[self.imagesFromExtract addObject:newImg]; 
j++;
}
}

2 个答案:

答案 0 :(得分:1)

问题可能就是

CIImage *outputImage = [ begin imageByApplyingTransform:transform];

分配一个在自动释放池耗尽之前不会释放的映像,当程序到达空闲循环时会发生这种情况。没有尝试过您的代码,我建议您将内循环包装在

@autoreleasepool {
    ...
}

阻止?

答案 1 :(得分:0)

UIImage *newImg = [UIImage imageWithCGImage:cgimg];

不是问题,你要将newImg添加到数组中,因此在退出方法后不应该销毁它。 问题是

CIImage *outputImage = [ begin imageByApplyingTransform:transform];

,但无论如何,建议使用

@autoreleasepool {
...
}

很好。

此外,如果您不再需要输入图像,可以在创建newImg后尝试从阵列中删除它们。