2

私の1人には、UIViewControllerいくつかの子ViewControllerがあります。それらは、左側の「オブジェクト」セクションにドラッグして、 「カスタムクラス」としてNSObject自分のものに入れることにより、インターフェイスビルダー内に構築されます。SpecialViewControllerこの設定でviewDidLoad、ビューとコントローラーの準備が整います。ワークフローは、次のスクリーンショットで示されています。

引っ張る

そして私の実装では、私は持っています:

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

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

シミュレーターで低メモリをシミュレートするとクラッシュが発生し、デバッガーはdidReceiveMemoryWarningof SpecialViewController(本体はちょうど[super didReceiveMemoryWarning];)で一時停止し、エラーが発生しますEXC_BAD_ACCESS (code=1, address=0xe0000008)。現時点では、親コントローラーは表示されていないため、安全に解放できます。

親コントローラーには、にのみ含ま[super didReceiveMemoryWarning];didReceiveMemoryWarningます。私はIBOutlets両方のクラスでnilingを試しました。それは役に立たなかった。

なぜこれが起こったのか考えていますか?

ARCでiOS4と5をターゲットにしています。SpecialViewControllerのサブクラスですUITableViewController

トレースを通して、私はそれParentController didReceiveMemoryWarningが前に呼び出されていることを発見しましたSpecialViewController

4

2 に答える 2

2

iOS> 6.0のアップデート:

低メモリ状態でビューがパージされなくなったため、このメソッドが呼び出されることはありません[1]


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

別のビューコントローラへの強い参照があります。これは、ビューが再び表示されたときに再作成されません。インスタンス変数を解放するためにを使用しないでください。代わりに、の実装に依存して、ビューの解放を処理します。didReceiveMemoryWarningsecSpecialViewControllerdidReceiveMemoryWarning

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

于 2012-05-07T14:10:31.183 に答える
2

ここにビューコントローラがあるようです。このようなクラスを作成することを選択した特別な理由はありますか?私の経験では、各UIViewControllerは個別のサブクラスである必要があります。でエラーが発生したという事実に基づいてdidReceiveMemoryWarning、問題は他の場所にあると思います。このViewControllerの初期化コードを共有できますか?

UIViewController Containmentのようなものを試みている場合は、おそらくこのプロセスをカバーするWWDCトピックをチェックする必要があります。

于 2012-05-07T13:47:38.073 に答える