2012-03-11 13 views
0

をリーク... 例えば、私はイメージが、それが更新されるたびに反転していることを1 UIImageView(アニメーションは30fpsのように、この画像の更新についてですと多くを反転する)持つ問題は、私は多くのメモリリークを持って

を持っています
image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored]; 

メモリリークの膨大な量を取得しているので、私は一度それを反転した後、私はそれをリリース:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored]; 
[image2 release]; 

ではなく、私は二度とアプリがフリーズし、そのコードを実行しようとした場合、問題は(I」はあなたは何かを解放してからそれを再び使うことはできないと思っていますか?この全体のメモリ割り当てとリリースのものに...

私は何をしますか?リリースされている場合は、イメージを元に戻す前にイメージを再定義しますか?ありがとう!

+0

どのようにリークがあるのですか? Analyzerを実行しましたか? (これはARC以外のアプリだと推測しています) –

+0

これは、後で 'image2'で何をしているのか見ていないのですが、' release'の代わりに '[image2 autorelease]'をやってみてください。あるいは、あなたがそれを使い終わったら '[image2 release]'を実行してください。 – yuji

+0

私は機器を使ってXcodeでプロファイルを実行し、漏れを見つけました。 –

答えて

1

イメージビューのimageプロパティを結果イメージに設定する必要があります。次に、は割り当てられたイメージを解放します。例:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored]; 
self.someImageView.image = image2; 
[image2 release]; 

代わりに、返されたイメージを自動解放することができます。これと同じように:

image2 = [[[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored] autorelease]; 
self.someImageView.image = image2; 

編集:あなたは、あなたが求めていたものを明らかにした後、ここに縦にあなたのイメージを反転するためのより良い方法です。あなたが正常に戻ってそれを変更したいとき

//lets suppose your image is already set on the image view 
imageView.transform = CGAffineTransformIdentity; 
imageView.transform = CGAffineTransformMakeScale(1.0, -1.0); 

はその後:

imageView.transform = CGAffineTransformIdentity; 
+0

もう一度やり直す必要がある場合は、1/30秒後にもう一度やり直してください –

+0

あなたは何をしているのかよく分かりません。実際はあなたのコードは意味をなさない。 'image2'を同じ画像(' image2')に設定しているのはなぜですか?あなたはイメージや何かをミラーリングしていますか?おそらくこれを行う最も最適化された方法ではありません。代わりに変換を使用することについて考えたことはありますか? –

+0

私はそれ自体を設定していますが、ミラーリングしています...現在の画像2は上下が逆転していますので、向きを変えています。しかし、イメージを新しいイメージ(毎秒30分の1秒)に更新するたびに、そのコードを使用するコードを使用する必要があります。したがって、イメージを更新してから、再度それを再調整しようとしますアプリはフリーズして終了します。 –

2

をおそらく最も簡単な方法は、保有財産画像2行い、その後、self.image2ではなく、プレーンimage2に割り当てることです。これにより、新しい値が割り当てられるたびに古いイメージが解放されます。しかし、によって行われた保持を解放するために[UIImage alloc] init...コールにautoreleaseコールを追加する必要があります。

2

同じ変数名を再利用すると、不必要に混乱させてしまいます。一時変数を追加します。

UIImage* image; // assuming you set this up earlier, and that it's retained 
UIImage* flippedImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUpMirrored]; 
// Now we're done with the old image. Release it, so it doesn't leak. 
[image release]; 
// And set the variable "image" to be the new, flipped image: 
image = flippedImage; 
+0

もう一度そのコードを実行する必要がある場合は、1/30秒後に画像が新しい反転画像に更新され、もう一度反転する必要がある場合は、すでにリリースしているのでフリーズしますか? –

+0

アスタリスクでそれを再定義するのは、あなたが望むならば、 "un-release"のように振る舞いますか? –

+1

このコードを 'image'に正確にしているのであれば、それはうまくいくはずです。コードが実行される前に、 'image'は保持されているUIImageを指しています。コードが実行された後、 'image'は別の保持されたUIImageを指し、古いイメージはなくなります。 –

関連する問題