アップルの<メモリ管理>でアウトレットについて話すときのドキュメント。
それは言う
カスタムビューコントローラクラスでは、viewDidUnloadを実装して、アクセサメソッドを呼び出してアウトレットをnilに設定できます。
この場合、アクセサメソッドを呼び出してnilを設定するとオブジェクトが解放され、ポインタをnilに設定すると、クラッシュを引き起こす可能性のある無効なポイントへのアクセスを防ぐことができるため、これは理解できます。
しかしその後、それは言う:
注:3.0より前のiOSでは、viewDidUnloadメソッドは使用できません。代わりに、次の例に示すように、setView:でアウトレットをnilに設定する必要があります。
- (void)setView:(UIView *)aView { if (!aView) { // View is being set to nil. // Set outlets to nil, e.g. self.anOutlet = nil; } // Invoke super's implementation last. [super setView:aView]; }
さらに、UIViewControllerでのdeallocの実装の詳細のため、deallocでアウトレット変数をnilに設定する必要もあります。
- (void)dealloc { // Release outlets and set outlet variables to nil. [anOutlet release], anOutlet = nil; [super dealloc]; }
1)deallocでもnilを設定する必要があるのはなぜですか?(deallocはオブジェクトのライフサイクルの最後のステップだと思います。他の誰もこのオブジェクトを介してアウトレットにアクセスすることはできません。)
2)iOS 3.0以降でもnilを設定する必要がありますか?(Xcodeが自動的に生成したコードはnilをアウトレット変数に設定せず、リリースするだけであることがわかりました)。