带有CGImage内存的CIImage长大了

时间:2017-06-20 08:39:11

标签: ios cgimage ciimage

我正在制作照片幻灯片应用。 我的应用流程: 用户选择照片资产> (超过100+) 从资产加载图片> (显示图像尺寸) 设置imageView图像或将CIFilter添加到图像和幻灯片

问题: 当我从CGImage创建CIImage对象时,内存增长如此之快,如果图像数超过100,则应用程序崩溃。 但是我删除创建代码很奇怪,应用程序运行正常。

有人能帮助我吗?

更多代码:

- (void)loadDisplayImagesWithCompletion:(void (^)(NSArray *images))completion {
    dispatch_async(dispatch_queue_create("PhotosEditViewController_loadImageQueue", nil), ^{

        __block NSMutableArray *images = [NSMutableArray array];
        __block int handleCount = 0;
        __weak PhotosEditViewController *weakSelf = self;

        for (PHAsset *asset in self.photoAssets) {
            [KPPhotoManager requestImageForAsset:asset targetSize:self.contentView.frame.size completeBlock:^(UIImage *image) {

                [images addObject:image];

                @autoreleasepool {
                    CIImage *ciImage = [CIImage imageWithCGImage:[image CGImage]];//memory growing up
                }
            }];
        }
    });
}

// KPPhotoManager

+ (void)requestImageForAsset:(PHAsset*)asset targetSize:(CGSize)size completeBlock:(void (^)(UIImage *image))completeBlock
    {
        [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:[self createImageRequestOptions] resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
            completeBlock(result);
        }];
    }

1 个答案:

答案 0 :(得分:0)

我创建了一个复制代码的新项目。我将调用次数增加到10000并且检查内存看起来都很好。它确实跳了一下,但没有膨胀。

我还尝试使用以下方式强制图像加载:

for (int i=0; i<10000; i++) {
    @autoreleasepool {
        UIImage *image = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"image2.png"]];
        [self createFilterImageWithImage:image];
    }
}

它仍然不会使记忆膨胀。

您是如何检查内存泄漏的?你在看内存消耗吗?您的项目或文件中是否有任何细节,例如禁用ARC?