我正在使用以下代码来应用图像过滤器。这对于缩小的图像效果很好。 但是,当我在全分辨率图像上应用 2 个以上的滤镜时,应用程序崩溃了。收到内存警告。
当我打开“分配”工具时,我看到 CFData(store) 占用了程序使用的大部分内存。 当我在全分辨率图像上应用 2 个以上滤镜时,“总字节”将达到 54MB。虽然当我用眼睛观察这些数字时,“事件字节”似乎没有达到超过 12MB,但峰值表明事件字节也达到了这个数字并返回。
我哪里出错了?
- (UIImage *)editImage:(UIImage *)imageToBeEdited tintValue:(float)tint
{
CIImage *image = [[CIImage alloc] initWithImage:imageToBeEdited];
NSLog(@"in edit Image:\ncheck image: %@\ncheck value:%f", image, tint);
[tintFilter setValue:image forKey:kCIInputImageKey];
[tintFilter setValue:[NSNumber numberWithFloat:tint] forKey:@"inputAngle"];
CIImage *outputImage = [tintFilter outputImage];
NSLog(@"check output image: %@", outputImage);
return [self completeEditingUsingOutputImage:outputImage];
}
- (UIImage *)completeEditingUsingOutputImage:(CIImage *)outputImage
{
CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent];
NSLog(@"check cgimg: %@", cgimg);
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
NSLog(@"check newImge: %@", newImage);
CGImageRelease(cgimg);
return newImage;
}
编辑: 我也尝试将 cgimg 设置为 nil。没有帮助。 我尝试将上下文声明和定义放在第二个函数中。没有帮助。 我尝试在函数内移动过滤器的声明和定义,但没有帮助。
崩溃发生在
CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent];
最佳答案
我正在制作的cgimg占用了内存中的大部分空间并且没有被释放。
我观察到,使用较小的值调用文件管理器会将 CFData(存储)内存值恢复为较小的值,从而避免崩溃。
所以我应用过滤器,然后调用相同的过滤器,图像为“nil”。应用所有 4 个过滤器后,这会将内存从 48 MB 恢复到 484kb 或其他值。
此外,我将此过滤器应用于后台线程而不是主线程。再次在主线程上应用会导致崩溃。可能没有足够的时间来释放内存。我不知道。 但这些事情现在进展顺利。
关于ios - 应用核心图像过滤器时处理内存警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301810/