我正在创建一个照片幻灯片应用程序。 我的应用流程 : 用户选择照片资产>(超过 100+) 从资产>加载图像(显示图像大小) 设置图像查看图像或将 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);
}];
}
我创建了一个复制您的代码的新项目。我将调用次数增加到 10000 次,并检查内存看起来都很好。它确实跳了一点,但不会膨胀。
我还尝试使用以下方法强制加载图像:
for (int i=0; i<10000; i++) {
@autoreleasepool {
UIImage *image = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"image2.png"]];
[self createFilterImageWithImage:image];
}
}
而且它仍然不会膨胀内存。
您如何检查内存泄漏?您是否在查看内存消耗?您的项目或文件中是否有任何细节,例如禁用了 ARC?