6

ええ、私はこのクレイジーな iPhone の世界では Java 派です。メモリ管理に関しては、自分が何をしているのかまだよくわかりません。

ナビゲーション コントローラーを使用するアプリがあり、次のビューに進むときは、次のようなコードがあります。

UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                                                                    bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];

現在、メモリ管理に関するAppleの基本的なルールに従っています

名前が「alloc」または「new」で始まるメソッド、または「copy」を含むメソッド (たとえば、、、または ) を使用してオブジェクトを作成した場合、またはオブジェクトにメッセージを送信した場合、オブジェクトの所有権をalloc取得newObjectmutableCopyますretainreleaseまたはを使用して所有しているオブジェクトの所有権を放棄する責任がありますautorelease。それ以外のオブジェクトを受け取った場合は、それを解放してはなりません。

myController私にとって、それは私が をリリースするか、メッセージを与えるべきであることを意味しautoreleaseます。しかし、それをしようとすると、ビューをスタックからプッシュおよびポップするときに、アプリケーションがクラッシュしてしまいます。

これは私には適切な匂いがしませんでしたが、Instruments を実行すると、メモリ リークが発生していないと主張されます。

だから私は私の質問は

  1. 私はこれを正しく行っていますか?
  2. ナビゲーション コントローラーが MyViewController の所有権を取得して、メモリ リークがないことを説明していますか?
  3. ルート ViewController のインスタンス変数に myController を割り当てる必要がありますか? その場合、retain とマークされ、ルートの dealloc メソッドで解放します
4

2 に答える 2

9

問題は (ほとんどの場合) 、Navigation Controller が所有権を主張する前に、 viewController を解放していることです。これには 2 つの方法があります。

  • -releaseコントローラーをナビコントローラーにプッシュした
  • -autoreleaseコントローラーを押す前に。これを行うと、アクティブな NSAutoreleasePool (心配する必要はありません) が後でコントローラーを解放します。
于 2008-10-30T18:24:12.870 に答える
3

@Ben Gottliebなぜプッシュする前に自動リリースする必要があるのですか?オブジェクト割り当て時の保持カウントは1です。プッシュの前後の自動解放は保持カウントに影響しませんが、通常、スタイルの問題として自動解放はオブジェクトalloc/initの後に適用されます。

[[[object alloc] init] autorelease];

@ bpapa、

2)押すと、ナビゲーションコントローラーはビューコントローラーを保持します。後でこのビューがナビゲーションコントローラースタックからポップされると、ナビゲーションコントローラーはそれを解放します。

3)そのビューを保持する明確な理由がない限り、インスタンス変数に割り当てないでください。一般に、ビューは必要な期間だけ存在する必要があります。

于 2008-10-30T21:29:35.320 に答える