当我使用以下方法(在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++;
}
}
答案 0 :(得分:1)
问题可能就是
CIImage *outputImage = [ begin imageByApplyingTransform:transform];
分配一个在自动释放池耗尽之前不会释放的映像,当程序到达空闲循环时会发生这种情况。没有尝试过您的代码,我建议您将内循环包装在
中@autoreleasepool {
...
}
阻止?
答案 1 :(得分:0)
UIImage *newImg = [UIImage imageWithCGImage:cgimg];
不是问题,你要将newImg添加到数组中,因此在退出方法后不应该销毁它。 问题是
CIImage *outputImage = [ begin imageByApplyingTransform:transform];
,但无论如何,建议使用
@autoreleasepool {
...
}
很好。
此外,如果您不再需要输入图像,可以在创建newImg后尝试从阵列中删除它们。