4

シンプルなビデオ ストリームを実装しようとしていますが、何らかの理由でメモリが解放されません。

(void)updateImage:(UIImage *)image{
  self.indicator.hidden = TRUE;
  //CGImageRelease([self.imageView.image CGImage]);
  self.imageView.image = nil;
  self.imageView.image = image;
  [self.imageView setNeedsDisplay];
}

私が使用する場合

CGImageRelease([self.imageView.image CGImage]);

メモリが解放されます。しかし、以前のView Controllerに戻ると、すでに解放したその画像に割り当てられたメモリを解放しようとするため、アプリがクラッシュします。このメソッドは、以下を使用してイメージを作成する非同期タスクから呼び出されます。

UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CGDataProviderRelease(provider);
CFRelease(data);

私が理解しているように、UIImage は CGImage を所有するようになったので、解放する必要はありません。UIImageView を新しい画像で更新したときに UIImage が確実に解放されるようにする方法はありますか?

4

1 に答える 1

5

わかりましたので、私は最終的に問題を理解しました。

バックグラウンド スレッドを使用してイメージの更新を実行していると述べたように、解決策は次のようにそれを自動解放プールとして追加することでした。

   @autoreleasepool {
        [self.delegate performSelectorOnMainThread:@selector(updateImage:) withObject:[self fetchImage] waitUntilDone:NO];
    }
于 2013-01-24T08:26:21.990 に答える