1

次の2つのアプローチについて疑問に思っています。

初め:

    SomeViewController *someViewController = [[SomeViewController alloc] init];
    [self.navigationController pushViewController:someViewController animated:YES];
    [someViewController release];

2番:

SomeViewController *someViewController = [[SomeViewController alloc] init];
self.iVarViewController = someViewController;
[someViewController release];
[self.navigationController pushViewController:self.iVarVierController animated:YES];

最初のアプローチを採用しても問題ありませんか、それとも常に 2 番目のアプローチを採用する必要がありますか? 最初のアプローチの何が問題なのですか?「someViewController」がスタックにプッシュされると、保持カウントが増加するため、完全に解放されることはありませんか? 2 番目のアプローチのようにプロパティに割り当てたいと思うのはなぜでしょうか? しかし、2 番目のアプローチでは、いつリリースされるかはわかりません。

私は同様の投稿を読みましたが、私はまだ少し確信が持てないので、もっと簡単に質問したいと思いました.

4

2 に答える 2

1

どちらもOKです。スタックにプッシュSomeViewControllerすると、その保持カウントがインクリメントされます。スタックからポップされると、保持カウントが再び減少します。後で明示的に解放する必要はありません。実際、これにより例外が発生する可能性があります。

単純な一般規則があります: を呼び出すときはいつでもalloc/retain/new/copy*、いつか呼び出す必要がありreleaseます。

ここでは 1 回だけ呼び出しallocているため、1 回だけ呼び出す必要がありますrelease

retain編集: 2 番目のアプローチでは、setter を使用して暗黙的に呼び出しています。その場合release、メモリリークを防ぐために後で追加が必要になります。

于 2010-11-20T14:27:19.487 に答える
0

2つのアプローチの結果はわずかに異なります。最初の例では、インスタンスSomeViewControllerとそのビューは、インスタンスがポップされるとすぐに割り当てが解除されます。2番目の例では、のインスタンスはSomeViewController、新しいインスタンス()に置き換えられるまでメモリに保持されますself.iVarViewController = someViewController

2番目のアプローチは、2番目のコントローラーがポップされた後に最初のビューコントローラーが2番目のビューコントローラーにメッセージを送信する必要がある場合(変更されたプロパティ値を取得するなど)に意味があります。ただし、この場合、プロパティに格納されているインスタンスを再利用するだけでなく、毎回オブジェクトを再作成することが理にかなっているかどうかを自問する必要があります(ivarViewController例では)。

一方が他方より優れているかどうかは、アプリのこの部分で予想される使用パターンと、2番目のコントローラーとそのビューのパフォーマンス特性の組み合わせによって異なります。(たとえば、オブジェクトはどのくらいのメモリを消費し、ユーザーは通常、2つのコントローラー間でどのくらいの頻度で切り替えますか?)

于 2010-11-20T15:38:50.503 に答える