2009-05-24 2 views
3

UIViewsにネストされたいくつかのUIImageViewsがあります。それらは一緒にグループ化されています。それらはView Controllerによって所有されています。直ちに-viewWillDisappearメソッドが呼び出されると、UIImageViewsをUIViewsですべて削除して、メモリを解放します。UIImageViewsを画面から削除してメモリを安全に解放するにはどうすればよいですか?

私はサブビューとしてUIImageViewsを含むUIViewを呼び出します。 UIImageViewsを所有するものは他にありません。私が持っているのは、UIImageViewsをまとめてグループ化するUIViewのインスタンス変数です。

私がそれを送ったとき、保持カウントは0になるはずです。しかし、それは私がより多くの空きメモリを獲得するという保証ではありません、そうですか?したがって、myUIView = nilも設定します。それは有益/有用なのでしょうか?どのように安全にメモリを解放しますか?

答えて

3

このケースの場合、-viewDidDisappear-viewWillDisappearではなく、まだオンスクリーンです)で行うべき最良のことは、self.view = nilです。それは、ビューコントローラ全体のビューをダンプします。ビューは、次に必要なときに自動的にリロードされます。

これらのビューにIBOutletがある場合は、それらをnilに設定する必要があります。そうしないと、リリースされません。あなたはこのようなセットアップを持っていると仮定すると:

@interface MyViewController : UIViewController 
{ 
    UIImageView *_imageView; 
} 
@property (readwrite, retain) IBOutlet UIImageView *imageView; 

@implementation MyViewController 
@synthesize imageView = _imageView; 

次に、あなたの `-viewWillDisappearでself.imageView = nilを呼び出す必要があります。

通常、あなたのアクセサリー以外の場合は、をイヤーズに、-deallocには電話しないでください。それらを解放する正しい方法は、アクセサを使用してそれらをnilに設定することです。

-releaseの場合、retainCountが1の場合は即座にfree()が呼び出され、メモリが回復します。ただし、自動解放プールを含む他のオブジェクトがオブジェクトを保持している可能性があるので、保持カウントが特定の時点で何であるかは不明です。

私は、変数をリリースしてすぐにそれをnilに設定することを強く勧めます。これは変数には影響しません。あなたが解放したポインタを追いかけることからあなたを守り、未割り当てのメモリを指し示すかもしれません。あなたは-viewDidDisappear本当に>>>「あなたは `-viewWillDisappearにself.imageView = nilを呼び出す必要があります次に」

[_stuff release]; _stuff = nil; 
[_otherStuff release]; _otherStuff = nil; 
+0

ません:だから-deallocで、私はこのような行がありますか? – Thanks

+0

申し訳ありません。後方に。ビューの削除に関係するすべての操作は、viewDidDisappearで行う必要があります。あなたは物事を落とし始めるためにあなたがオフスクリーンになるまで待つべきです。 viewWillDisappearにUIコンポーネントをドロップすると、アニメーションが乱れることがあります(viewWillDisappearとviewDidDisAppearの間でアニメーションを作成するため)。 –

関連する問題