4

viewDidLoadこれは、iOS 4.x 以下で保持されているビューをリリースする正しい (最善の) 方法ですか? 他に考慮すべきことはありますか?

- (void) viewDidUnload
{
    [super viewDidUnload];
    [self releaseViews];
}

- (void) dealloc {
    [self releaseViews];
    [super dealloc];
}

#define SAFE_RELEASE(a) [a release]; a = nil;

- (void) releaseViews {
    SAFE_RELEASE(myView1);
    SAFE_RELEASE(myView2);
    SAFE_RELEASE(myView3);
}
4

3 に答える 3

5

これ-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 用にビルドする場合を除く)。
于 2011-08-14T16:10:35.850 に答える
1

それが最善の方法かどうかはわかりませんが、これらのビューをviewDidLoadに保持している場合は、正しい方法です。

Deallocでは、変数をnilに設定する必要はありませんが、設定しても問題はないため、viewDidLoadとdeallocの両方に同じメソッドを使用できます。

于 2011-08-14T17:26:13.233 に答える
0

viewDidLoad で再作成する場合、または IBOutlets でない限り、viewDidUnload では実行しないでください。ここここに良い情報があります。

于 2011-08-14T16:07:23.427 に答える