0

UIViewController サブクラスをナビゲーション スタックにプッシュしています。ただし、navigationController によって保持されているため、ポインタをスタックにプッシュした後、ポインタを「解放」して、最終的にポップされたときに viewController が解放されるようにします。

ただし、機能していません。viewController の dealloc メソッドが呼び出されることはありません。コードは次のようになります。

MyViewController *newViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"foo"];

[self.navigationController pushViewController:newViewController animated:YES];

newViewController = nil;

次のコードでも、私の newViewController は解放されていません。

MyViewController *newViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"foo"];
newViewController = nil;

私が理解していることから、新しい自動参照カウント (ARC) システムの下では、オブジェクトが何も指されないと、オブジェクトの割り当てが解除されます。作成中のviewControllerのdeallocメソッドにNSLogメソッドを入れたのですが一向に呼び出されません。

ここで何が欠けていますか?!

スタック オーバーフローに関する私の最初の投稿を読んでくれてありがとう :)

**編集: * *

謝罪します。自動解放プールにラップされた 2 番目のコードを試したところ、割り当てが解除されました。次に、自動解放プールなしで試してみたところ、適切に割り当て解除されました。昨夜何が起こったのかわかりません。

(2回目の編集:そして今、再び機能しなくなりました.ffffffuuuuuuuuuuuuuu)

4

1 に答える 1

1

最初の例では、新しいビュー コントローラーの割り当てが解除された場合は非常に奇妙です。これは、それをナビゲーション コントローラーにプッシュしたため、ナビゲーション コントローラーがそれを強く参照しているためです。オブジェクトは、すべての強い参照がなくなったときにのみ割り当てが解除されます。

autorelease2 番目の例では、返されたオブジェクトに、の実装の内部で実行された呼び出しからの保留中のリリースが残っている可能性がありinstantiateInitialViewControllerます。したがって、現在の自動解放プールが空になるまで、それが消えることはありません。さらに、UIStoryboardクラスが返されたオブジェクトを最適化としてキャッシュする可能性があります。

要するに、ARC を使用しても、フレームワーク メソッドから受け取ったオブジェクトが、そのメソッドの実装で autorelease が使用されていないことを保証できないため、処理が完了したらすぐに解放されるとはまだ想定できません。

于 2011-07-30T05:44:48.040 に答える