1

ViewControllerクラスが毎回このようなことをしないと、メモリ不足の警告(ユーザーが見たいとすぐに再度ロードする)のためにビューを一時的に放棄すると、メモリの問題が発生することをどこかで読んでいました。そのビューのアウトレット:

-(void)dealloc {
    [myView release], myView = nil;
    [myLabel release], myLabel = nil;
    [super dealloc];
}

私はここで混乱しています。なぜなら、実際には [myView release] もゼロになると思っていたからです。変数はもうオブジェクトを保持していないと言っています。なんで二回?それとも、私が見逃したものがありますか?

4

2 に答える 2

5

を呼び出し[myView release]ても の値は変更されず、myViewを指すオブジェクトの保持カウントが減少しますmyView(オブジェクトの保持カウントがゼロになると、それdealloc自体が s になります)。を呼び出した後[myView release]myView、 にはビュー オブジェクトのアドレスが含まれていますが、 がmyView唯一の所有者であった場合、そのオブジェクトはdeallocそれ自体を編集してしまい、メモリは無効になります (そして、別のオブジェクトまたは他のデータによって占められている可能性があります)。に設定myViewするnilことで、 に属していた古いメモリを誤って使用しないようにし、が初期化または破棄されたmyViewかどうかをテストできるようになりました。myView

いずれにせよ、この時点でView Controllerがなくなるため、メソッドで to を設定myViewする必要はないことに注意してください。ただし、メモリ不足の警告に応答してビューを破棄する場合は、これを行う必要があります。ビューが表示されていない場合は、ビュー コントローラー全体を破棄することも検討してください。nil-dealloc

于 2009-04-24T16:17:06.547 に答える
0

ビューコントローラがメモリ警告を受け取り、ビューが画面外にある場合、ビュープロパティをnilに設定することがあります。ただし、他のプロパティに保持している可能性のあるサブビューは解放されません。それで、これを処理する方法は次のとおりです。

- (void)setView:(UIView *)view
{
  [super setView:view];
  if (view == nil)
  {
    // Release-and-nil any subviews that you might be retaining.
  }
}
于 2009-04-24T18:30:05.103 に答える