2012-05-03 10 views
2

私のUIViewControllerには複数の子ビューコントローラがあります。それらはインターフェイスビルダー内に組み込まれています。NSObjectを左側のオブジェクトセクションにドラッグして、自分のSpecialViewControllerを「カスタムクラス」とします。この設定では、viewDidLoadに私のビューとコントローラを準備します。ワークフローは次のスクリーンショットによって提案された:正しく処理しましたdidReceiveMemoryWarning

Drag "Object" to create instance

そして、私の実装では、私が持っている:

@interface ParentController : UIViewController 
{ 
    SpecialViewController *svc; 
} 
@property (nonatomic, retain) IBOutlet SpecialViewController *svc; 

私はdidReceiveMemoryWarning時に私は自分のリソースを解放する必要があることを理解しています。次にviewDidUnloadの間にIBOutletsをnilに設定します。

シミュレータでメモリ不足をシミュレートするとき、私は、デバッガがエラーEXC_BAD_ACCESS (code=1, address=0xe0000008)と、(そのボディだけ[super didReceiveMemoryWarning];です)SpecialViewControllerdidReceiveMemoryWarningで一時停止し、クラッシュを取得します。現時点では、親コントローラは表示されないため、安全に解放することができます。

親コントローラには、[super didReceiveMemoryWarning];も含まれます。didReceiveMemoryWarningです。私はどちらのクラスでもIBOutletsを試しました。それは助けになりませんでした。

これはどうして起こったのでしょうか?

私は、ARCを使用してiOS 4 & 5をターゲティングしています。 SpecialViewControllerUITableViewControllerのサブクラスです。

トレースすると、ParentController didReceiveMemoryWarningSpecialViewControllerの前に呼び出されました。

+1

リリースオブジェクトとセットオブジェクトがnilに等しくない。もしあなたがメモリ警告を受け取ったら、未使用**のリソースを解放する必要があります。 '[svc release]'を最初に試してください。 – Feo

+1

@Feo、Hmm ...私はARCを使用しています。私は未使用のリソースをリリースしました。それらは私が自分のクラスで管理しているものです、正しい? –

+0

あなたは 'self.scv = nil'をやっていますか? – Peres

答えて

2

ビューコントローラにビューコントローラがあるようです。このようなクラスを作成することを決めた特別な理由はありますか?私の経験では、各UIViewControllerは別個のサブクラスでなければなりません。 didReceiveMemoryWarningにあなたのエラーが発生しているという事実に基づいて、私はその問題が他の場所にあると信じています。このView Controllerの初期化コードを共有できますか?

UIViewController Containmentのようなものを試している場合は、このプロセスをカバーするWWDCのトピックをチェックしてください。

+0

私はこれが奇妙なアプローチだとは知らない。 '' initWithNibName''メソッドはsuperを呼び出す以外に何もしません。私はどこかでこの方法を見て回ったが、今実際にリンクを取得することはできません。このように設計されているのは、同時に表示されていないUIに3つの異なるテーブルビューがあるためです。デザインが悪いですか? –

+0

はい、非常に悪いデザインです。 1つのUIViewController内に3つのUITableViewが含まれています。 3つのUITableViewのうち2つに 'hidden'プロパティをプログラム的に切り替えて、正しいものを表示します。 – Sam

+0

あなたは3 "UITableViewControllers''を起動せずにそれを行うべきですか?自分の代理人を介して別々に管理するだけですか?ああ、私はちょうどそれを持っています。私は余分なコントローラを使用すべきではありません。私は代議員が必要です。ありがとうございました。コードを修正し、まもなくあなたの答えを受け入れることにします。 –

2

ViewコントローラのdidReceiveMemoryWarningデフォルトの実装はビューを解放します。あなたの責任は、viewDidLoadまたはloadViewで作成された他のビューだけでなく、IBOutletサブビューへの強い参照をリリースすることです。

ビューがもう一度表示されたらが再作成されない別のビューコントローラへの強い参照があります。 でない場合didReceiveMemoryWarningを使用してsecインスタンス変数を解放してください。代わりにSpecialViewControllerdidReceiveMemoryWarning実装に依存して、そのビューを解放するようにしてください。実際に

、私は私のメインビュー(self.view)を放出し、viewDidLoadで作成されたものを解放するためにviewDidUnloadを使用するdidReceiveMemoryWarningを使用しています。私は、メソッドの名前とその使い方のバランスが直感的であることを発見しました。 viewDidLoadに何かを作成する場合は、viewDidUnloadにリリースしてください。

+0

実際には、 '' IBOutlets''を省略しても同じようにクラッシュします。私は、自分のコードを保護するためにしかないプロセスが存在すると思います。理論的には必要ではありませんが、正しいのですか?しかし、私の主張はコントローラが.xibに組み込まれていることです。私は '' viewDidLoad''でそれらを作成していません。 –

+0

彼らはあなたができるだけ多くのメモリを解放するようにnilされていません(nilに設定すると、以前のインスタンスはすべて解放されます)。あなたがiOS 4をターゲットにしているので、弱参照をゼロにしていないので、変数がnilへの参照を設定せずに解放されている可能性があります。 View Controllerに 'svc'を公開していないと確信していますか?そしてあなたはどこにでも 'NSNotificationCenter'を使っていますか?私は、iOS 4でも同様の問題を引き起こしているのを見てきました。 –

+0

ARCの下で.xibにオブジェクトが作成されていますが、実際にリリースすることはできません。私は解放を呼び出すことはできません。しかし、私が言ったように、それはnil'edかどうかは同じです。 '' didReceiveMemoryWarning''で何もしないとクラッシュします。まだ '' viewDidUnload''には至りませんでした。 –

関連する問題