当我仅在主线程上执行以下操作时,iref
会立即自动释放:
-(void)loadImage:(ALAsset*)asset{
@autoreleasepool {
ALAssetRepresentation* rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullScreenImage];
UIImage* image = [UIImage imageWithCGImage:iref
scale:[rep scale]
orientation:UIImageOrientationUp];
[self.imageView setImage:image];
}
}
但是当我在后台线程上使用 GCD 执行 imageWithCGImage: 时,iref
不会像第一个示例中那样立即释放。大约一分钟后:
-(void)loadImage:(ALAsset*)asset{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
@autoreleasepool {
ALAssetRepresentation* rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullScreenImage];
UIImage* image = [UIImage imageWithCGImage:iref
scale:[rep scale]
orientation:UIImageOrientationUp];
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self.imageView setImage:image];
});
}
});
}
如何使CGImageRef
对象立即释放?
先前的研究:
- 当我用它记录时,泄漏仪器没有显示任何泄漏。
- Allocations 工具显示一个
CGImageRef
对象已被分配,并且在它应该被释放后仍然存在大约一分钟。 - 如果我尝试使用手动释放
CGImageRef
对象,CGImageRelease
则在一分钟后图像尝试自动释放时会出现 BAD_EXEC 异常。 - 保留
iref
使用CGImageRetain
然后使用CGImageRelease
释放它不起作用。 - 关于stackoverflow的类似问题没有帮助:使用gcd加载图像,在创建图像时收到内存警告,从alaseet结果获取全屏图像时内存泄漏,