メインスレッドでのみ次を実行すると、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];
}
}
しかし、imageWithCGImage: with GCD をバックグラウンド スレッドで実行するiref
と、最初の例のようにすぐに解放されません。約1分後:
-(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
オブジェクトをすぐに解放するにはどうすればよいですか?
先行研究:
- Leak インストゥルメントで録音すると、リークが表示されません。
- Allocations インストゥルメントは、
CGImageRef
オブジェクトが割り当てられ、解放されるべきだった後も約 1 分間はまだ生きていることを示しています。 CGImageRef
を使用してオブジェクトを手動で解放CGImageRelease
しようとすると、イメージが自動解放されようとする 1 分後に BAD_EXEC 例外が発生します。iref
使用を保持してCGImageRetain
から使用CGImageRelease
して解放することはできません。- 役に立たなかったスタックオーバーフローに関する同様の質問: gcd を使用した画像の読み込み、 create imageでのメモリ警告の受信、alaseet result から fullscreenimage を取得するときのメモリリーク、