これ-dealloc
は正しく、-viewDidUnload
機能しますが、通常、保持されているビューは削除されるだけで-viewDidUnload
、解放されません。これは Apple の慣行でもあるようで、アシスタント エディタを介して自動生成された IBOutlet を作成するときに、Apple が Xcode に焼き付けたものです。
自動生成された IBOutlets の場合、自動生成-viewDidUnload
は次のようになります。
- (void)viewDidUnload {
[self myView1:nil];
[self myView2:nil];
[self myView3:nil];
[super viewDidUnload];
}
また、次のAppleドキュメントから-viewDidUnload
:
オブジェクト (アウトレット内のものを含む) の所有権を放棄するための推奨される方法は、対応するアクセサ メソッドを使用してオブジェクトの値を nil に設定することです。ただし、特定のオブジェクトのアクセサ メソッドがない場合は、オブジェクトを明示的に解放する必要がある場合があります。
では、どうぞ。アウトレットにプロパティが関連付けられている場合 (すべてのアウトレットに関連付けられているはずです)、それを nil し-viewDidUnload
ますが、解放しないでください。これは、合成されたアクセサーで実際に何が起こっているかを考えると理にかなっています。コードは次のようになります。
- (void) setMyView1 : (UIView *) view {
if (myView1) // the associated IVAR is already set
[myView1 release];
myView1 = [view retain];
}
ご覧のとおり、synthesize プロパティを nil に設定すると、保持されたオブジェクトが暗黙的に解放されます。
に関するドキュメントからも-dealloc
:
このメソッドを実装し、iOS 2.x 用のアプリケーションを構築している場合、dealloc メソッドは各オブジェクトを解放する必要がありますが、super を呼び出す前にそのオブジェクトへの参照を nil に設定する必要があります。
iOS2.x をサポートしていない限り、dealloc でオブジェクトを nil に設定する必要はありません。
したがって、 および に関する Apple のドキュメントを要約すると、次のように-viewDidUnload
なり-dealloc
ます。
- では
-viewDidUnload
、nil プロパティ (IBOutlet プロパティを含む)、ただし解放しない
-dealloc
リリース プロパティでは、ただしそれらを nil にしないでください (2.x 用にビルドする場合を除く)。