2011-02-04 7 views
0

私は望む時にuiimage/view/subviewsをリリースする必要があり、それらを解放する適切な練習に関していくつか質問があります。(iphone)uiimage、view、subviewsメモリ管理

  1. [imageView removeFromSuperview]はimageViewとimageView.imageをリリースしますか?

  2. view = nil;そのサブビュー/関連するuiimagesを再帰的に解放するでしょうか?ビューのサブビューを解放する再帰関数を実装する必要がありますか?


編集ありがとうございました。

私はUIViewのライブラリの参照で

addSubview見えた -

をこの方法では、ビューを保持し、 が新しいスーパーで受信機にその 次のレスポンダを設定します。

removeFromSuperview -

レシーバのスーパーが nilでない場合は、スーパーは レシーバをリリースします。ビューを再利用する予定がある場合は、 をこのメソッドに呼び出してから、後でもう一度解放してください( )。

まだわからない[ImageViewのリリース]は、uiImageは、それに関連付けられた を解放し、私はまだサブビューの解除を再帰的に必要になります。つまり、ビューの割り当てが解除されると、サブビューのリリースが自動的に保証されますか?

答えて

1

[ImageViewのremoveFromSuperview]は ImageViewのと imageView.imageをリリースするのでしょうか?

ですが、ビューの保持数に注意する必要があります。あなたがremoveFromSuperviewを呼び出したという理由だけで、あなたが望むことをやっているわけではありません。

view = nil;再帰的に サブビュー/関連する画像を で公開しますか?そうでない場合、私は ビューのサブビューをリリースする再帰関数を実装する必要がありますか?

いいえ、作成している間にサブビューをどのように管理したかによって異なります。リリースを呼び出して、あなたの最後の質問に答えるために、いいえ:

for (UIView* subview in view){ 
    [subview removeFromSuperView]; 
    [subview release] 
} 
[view release]; 

EDIT:スーパービューが彼らの唯一の参照をした場合、彼らはおそらくremoveFromSuperview)はエラーになります呼び出した後にリリースを呼び出すため、保持1の数とを持っていますビューはすべてのサブビューで自動的にreleaseを呼び出さない。あなたは、それがreleaseかremoveFromSuperviewかにかかわらず、自分で行う必要があります。

+0

私は 'release'はdeallocではなく、保持カウントがゼロになるとメモリが解放されることを知っています(私は他のすべての参照を処理する必要があることを知っています)。ビューのサブビューをすべて解放するには、再帰的なremoveFromsuperview(またはrelease)を実装する必要があります。 : – eugene

+0

はい、uiImageをリリースするにはimageView.image = nilが必要ですか、imageView.imageもリリースされますか? – eugene

+0

UIImageViewは、解放されたときにすべてのデータを解放すると仮定することができます。 UIImageViewの呼び出しの呼び出しは、そのデータに対してreleaseを呼び出さない。 – jakev

1

[imageView removeFromSuperview]を実行すると、何もリリースされません。あなたは後で[imageView release]にする必要があります。それでも、あなたはまだあなたの記憶をimageViewのdeallocにそのビューのために解放する必要があります。

+0

[parentView addSubview:childView]はchildViewを保持し、[parent removeFromSuperview:childView]はchildViewを解放すると考えました。どちらの仮定も間違っていますか? – eugene

+0

あなたは正しいかもしれません。私が言及したやり方は、いつもそうだと思った方法です。他の誰かが私が間違っていると言うかどうかを見てみましょう。 :) –