2012-01-13 10 views
1

UIViewControllerで奇妙な(非?)問題が発生しました。それはコントローラがdeallocされたときに、そのサブビューを解放していないようです。サブビューのdeallocメソッドとビューコントローラのすべてにNSLogメッセージを配置しました。ビューコントローラdeallocは呼び出されますが、サブビューは呼び出されません。しかし、そのビューコントローラの別のインスタンスをナビゲーションスタックにプッシュすると、前のインスタンスのすべてのサブビューが解放されたように見えます(コンソールにNSLogメッセージが表示されます)。私はチェックして、プレゼンテーション・ビュー・コントローラー(プッシュしているビュー・コントローラー)のカスタム・ビュー・コントローラーへの個別の参照はありません。dealloc(ARCを使用)を使用している場合、UIViewControllerはサブビューを解放しません。

小さい(多分)詳細:カスタムビューコントローラは、格納してからポップする前に実行するブロックを受け取ります。しかし、私はそれに無関係を送りました、そして、私は同じ振る舞いをします。さらに、プレゼンテーション・ビュー・コントローラはスタックがポップされたときにデアロックするため、保持するサイクルはありません。

また、カスタムビューコントローラーのdeallocメソッドで各ビューを明示的に解放しようとしました。同じ振る舞い。

ナビゲーションコントローラがそれを保持している可能性はありますか?私の他のView Controllerのいずれにもこれを行うようには見えません。

私の問題は、(これらのすべてのサブビューの)メモリリークを表していることです。漏れは積み重ねませんが、まだ漏れです。あなたは多分それは試して

+2

最小の例が役立ちます。 – Joe

+0

私は@Joeに同意し、いくつかのコードを共有します。特に、前にブロックが漏れているという問題がありました。コードパスが実行されない限り、これをnilに設定しても問題ありません。 – Sam

+0

申し訳ありませんが、例がありませんが、これは2つのクラス、合計で約1,000行のコードと関係があります。そのコードのどこに問題が発生しているのかわかりません。 –

答えて

7

これは恥ずかしいです。私は誤ってコレクションクラスとして使用していた別のクラス(ViewDefと呼ばれる)で問題を見つけました。私が最初にいくつかのアニメーションを数ヶ月前に見つけたとき、それは私のサブビューを追跡するための素早く汚い方法でした。 ViewDefは、データベースから取得したフレーム/フォント/色/ etc情報を格納していたので、アニメーションを(方向の間に)計算するときにもビューを保存すると便利でした。これらのViewDefは私のモデルで保存されていたので、ビューも保持されていました(そして後で別のView Controllerで置き換えられました)。とにかく、後でこれを修正するために私のコードに警告を挿入するのを忘れていました。

ストーリーの道徳:あなたが何かばかげたことを計画しているなら、少なくともあなたの愚かさを記録して、インターネットで後で放送する必要はありません。

0

は、すべてのサブビューの代表者がnilに設定されていることを確認することです。

+0

ええ、私はそれを書いた後にそれを試みましたが、行っていません。 –

0

一つのことをするのに役立ちますviewDidUnloadメソッドでnilにサブビューを設定してみてください可能性が

+0

実際、私のサブビューには代理人がいません。それらはすべてカスタムブロックです。そのブロックを使用しています。それでも、それは、カスタムビューコントローラ(deallocされている)で保持サイクルを引き起こします。 –