2012-02-24 9 views
0

私はあなたがボタンを押したときに、それはそれ上の画像に新しい画面を開くことをコードを書かれています。その新しい画面には、画面を閉じるボタンがあり、メイン画面に戻ります。iPhone/iPadのUIImage initWithContentsOfFile:

img = [UIImage imageNamed: @"Galaxy"]; 
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img]; 

しかし、私はこのような何かでこのコード行を交換する場合:

img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Minnesota" ofType:@"png"]]; 
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img]; 
[img release]; 

それは私として働き、私はこの(無漏洩等...)のようにそれを行う場合は、それが正常に動作しますメモリリークがあります。私が画像スクリーンを開くたびに、アプリはますます多くのメモリを使います。しかし、すべてのデアロックが呼び出されます。[img retainCount]でも最終リリース前に1が表示されます。何が間違っているのかわからないので、ここにバグがある可能性はありますか?

編集:ここでは

がImageDisplayためのdeallocメソッドであり、このメソッドが呼び出される:クラスメソッドでないインスタンスメソッドである、あなたはこのようにそれを使用します。imageNamedがあるためという

-(void) dealloc { 
    [img release]; 
    [super dealloc]; 
} 

答えて

0

注: initWithContentsOfFileを使用して

UIImage *myImage = [UIImage imageNamed:@"pony.png"]; 

あなたの投稿コードが正しく見えるので、リークがあなたのImageDisplayクラスのどこかでなければなりません。

0

あなたは割り当て、解放する必要がいけない、代わりにこれを使用してみてください:

[UIImage imageWithContentsOfFile:(NSString *)name] 
+1

それはinitWithContentsOfFile' 'よりも良い/速いのですか? –

+0

私はちょうどそれを試して、あなたの方法よりもはるかに少ないメモリを消費した。私のdeallocメソッドで –

3

あなたImageDisplay *displayは画像を保持しています。そうでなければならない。それを解放すると、保持されているすべてのエンティティを解放するはずです。あなたが示したコードでは、それをリリースしていません。典型的な使用は、モーダルか何か、それを表示する(またはナビゲーションコントローラにプッシュ)、コントローラは、今、それを管理しているものは何でもビューの手の中にその維持のライフサイクルを残して、それを解放するために含むビューコントローラを伝えることであろう。違いは、最初のコードサンプルで*imgが自動リリースされ、適切なときには自動的にリリースされ、2番目のコードサンプルでは解放されません。

ARCは、ここにあなたのベーコンを保存し、劇的にあなたのコードを簡素化します。あなたの肘に得るためにあなたのお尻の周りに行くようなものであるオブジェクトのクラスのインスタンスとして静的メソッドを呼び出すために本当に懸命に働いているので

また、あなたは、用語「静的メソッド」をグーグルすべきです。

も、retainCountを見て停止します。あらゆる種類のものがフレームワークのフードの下であなたのオブジェクトを保持するかもしれません。デバッグ戦略の一環としてretainCountを使用することは、confusionvilleへの片道チケットです。

+0

をリリースします...私はそのコードを追加します。 – MegaManX