1

以下の私のコードを見てください。この部分は、スタックからトップビューコントローラー(通常は同じArticleControllerController)をポップし(単一のコントローラーをポップするか、ルートコントローラーにポップするかに関係なく、問題は同じままであることがわかりました)、新しいコントローラーを作成してスタックに追加します。

問題は、その保持カウントがゼロになることは決してないため、deallocメソッドがArticleControllerController呼び出されることはなく、大量のさまざまなインターフェイスオブジェクトが解放されないままになることです。メモリが少ないために、最終的にアプリがクラッシュします(少なくともデバイスでは、少なくともこの部分が主な問題だと思います)。

- (void) navigateToNewsCategoryByIndex:(int)idx {
    [app.nav popViewControllerAnimated:NO]; // could be popToRootController
    ArticleControllerController *ac = [[ArticleControllerController alloc] init];
    ac.categoryIndex = idx;
    [app.nav pushViewController:ac animated:NO];
    [ac release];
    NSLog(@"AC retain count: %d", [ac retainCount]); // prints 2
} 

したがって、popViewControllerAnimatedは、残りの2つの保持のうちの1つだけを解放すると思います。なんで?何を探すべきですか?私に何ができる?2回電話[ac release]します(それはひどいことです)?

4

1 に答える 1

1

保持カウント2がナビゲーションコントローラーの正しい動作ではないことをどのように知っていますか?

UIKitの内部がどのように機能するかわからないため、retainCountを使用して割り当て/リリースのデバッグを行うことはできません。コード内で正しく保持およびリリースする限り、UIKitも正しく機能することを99.9%確信できます。

popViewControllerは、pushViewControllerが追加したすべての保持を削除すると思いますが、いくつになるかはわかりませんが、自動解放されるように設定されている可能性があるため、呼び出しの直後に解放されることを保証できません。 popViewControllerに。

UIKitナビゲーションコントローラーにバグがなく(そうでなければ、他の多くの開発者がそれについて不平を言うでしょう!)、コードのどこかにそれを保持していると仮定して作業します(おそらくそれを認識せずに割り当てる代わりに保持するように宣言されたプロパティを委任するなど)

お役に立てば幸いです。

于 2010-10-11T11:31:26.447 に答える