0

私はUIViewControllerサブクラスをナビゲーションスタックにプッシュしています。しかし、それはnavigationControllerによって保持されているので、スタックにプッシュした後でポインタを解放して、最終的にポップされたときにviewControllerが解放されるようにします。新しいARCメモリ管理でUIViewControllerが解放されない

しかし、動作していないので、viewControllerのdeallocメソッドは呼び出されません。コードは次のようなものになります。でも、次のコードで

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

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

newViewController = nil; 

を、私newViewControllerはdeallocを-EDされていません。

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

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

ここでは何が欠けていますか?スタックオーバーフローの私の最初の記事を読むための

感謝:)

** EDIT:**

私は謝罪。私はautoreleaseプールに包まれたコードの2番目の部分を試して、それは割り当て解除されました。私はその後、自動解放プールなしでそれを試して、それも適切に割り当てを解除しました。私は昨夜何が起こったのか分からない。

(第二編集:そして今、その再び動作を停止しfffffffuuuuuuuuuuuu)

+0

ARCはまだテスト中ですので、まだいくつかのバグがある可能性があります。 –

+0

instantiateViewControllerWithIdentifierは自動解放オブジェクトを返しますか?すなわち返される前に 'autorelease'メッセージが送られたものですか? – freespace

+0

NSTimerのターゲットはviewcontrollerですか? ARCの下では、タイマーはターゲットを保持したまま無効にする必要があります。 – jsz

答えて

1

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

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

簡潔に言えば、ARCを使用しても、フレームワークメソッドから受け取ったオブジェクトは、そのメソッドの実装では自動解放が使用されなかったことを保証できないため、すぐに解放されるとは考えられません。

+0

はい、あなたは正しいです、私はそれをスタックにプッシュすると、ビューコントローラは割り当て解除されません。しかし、私の問題は、一度スタックからポップすると割り当て解除されないということです。ナビゲーションコントローラーはポップアップしてもどこかの参照を保持している可能性があります(確認する必要があります) –

+0

@ JimTsaoナビゲーションコントローラーはポップ後に参照を保持しますか? – Prcela

関連する問題