回答:
すでに示されていることに加えて、私は背後にあるロジックについてさらに詳しく説明したいと思いました-viewDidUnload
。
これを実装する最も重要な理由の1つは、UIViewController
サブクラスには通常、ビュー階層内のさまざまなサブビューへの所有参照も含まれていることです。これらのプロパティは、たとえばIBOutlets
nibからロードするとき、またはの内部-loadView
でプログラムによって設定されている可能性があります。
サブビューの追加の所有権。これはUIViewController
、ビューがビュー階層から削除され、メモリを節約するために解放された場合でも、サブビューはビューによって解放されますが、サブビュー自体には未処理のサブビューがUIViewController
まだ含まれているため、実際には割り当て解除されません。それらのオブジェクトへの参照も保持します。UIViewController
これらのオブジェクトの追加の所有権を解放することで、オブジェクトの割り当てが解除され、メモリが解放されます。
ここで解放したオブジェクトは、通常、UIViewController
ビューがre-loaded
であるときに、ニブから、またはの実装を介して再作成および再設定され-loadView
ます。
また、UIViewController
view
プロパティはnil
、このメソッドが呼び出された時点であることに注意してください。
などのドキュメントは言います:
これは、ビューコントローラーがビューとそのビューに関連付けられているオブジェクトを解放してメモリを解放する必要があるメモリ不足状態のときに呼び出されます。
同じ状況dealloc
では呼び出されません。このメソッドは、OS3以降でのみ使用できます。iPhone OS 2.xで同じ状況に対処するのは本当に大変でした。
2015年7月更新:viewDidUnload
「メモリ不足の状態ではビューが削除されなくなったため、このメソッドが呼び出されない」ため、iOS 6では非推奨でした。だから、現代のアドバイスはそれを心配して使用しないことdealloc
です。
viewDidUnload
はビューではなく、ビューコントローラ内のメソッドであることに注意してください。ビューの dealloc
方法は時にビューのアンロードと呼ばれますが、ビューコントローラの dealloc
メソッドは、後になるまで呼び出されない場合があります。
メモリ不足の警告が表示され、ビューが表示されない場合、たとえば、UIImagePickerControllerを使用してユーザーに写真を撮らせたりすると、ビューがアンロードされ、その後再読み込みする必要があります。
結論:
ビューコントローラーにはビュープロパティがあります。通常、ペン先またはコードの一部は、このビューに他のビューを追加します。これは、次のように-viewDidLoadメソッド内で頻繁に発生します。
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
さらに、nibファイルはボタンを作成し、それをビューコントローラーのビューに追加できます。
iPhone OS 2.2では、システムから-didReceiveMemoryWarningが呼び出されたときに、メモリを解放するために何かを解放する必要がありました。それが理にかなっている場合は、ビューコントローラ全体のビューを解放できます。または、メモリを大量に消費するコンテンツのみ。
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
現在、新しいOS 3.0には-viewDidUnloadメソッドがあり、メモリが不足しているためにビューがアンロードされたときにシステムから呼び出されます(私を修正してください:正確にいつ呼び出されますか?)
-viewDidUnloadは、ビューコントローラー自体とビューの両方が所有していたすべてのオブジェクトを解放するために使用されます。理由:ビューコントローラーがビューの子への参照(ボタンなど)を保持している場合、その保持カウントが1以上であるため、参照された子ビューは解放されません。-viewDidUnloadで解放された後、解放できます。メモリから。
AppleはviewWillUnloadを非推奨にしました。今では、オブジェクトを解放するためにdidReceiveMemoryWarningまたはdeallocを使用する必要があります。
iOS 6では、UIViewControllerのviewWillUnloadメソッドとviewDidUnloadメソッドが廃止されました。これらのメソッドを使用してデータを解放していた場合は、代わりにdidReceiveMemoryWarningメソッドを使用してください。このメソッドを使用して、ビューコントローラーのビューが使用されていない場合は、ビューへの参照を解放することもできます。これを行う前に、ビューがウィンドウ内にないことをテストする必要があります。