0

これは、アプリがメモリ警告を受け取ったときに行うべき正しいことを完全に理解していないことに起因する可能性があると思います (または、メモリ警告を受け取ったときに iOS が独自に行うことを理解していない可能性があります)。

ここに私の問題の簡略版があります:

私は持っていRootViewControllerます。TextViewControllerそれは私が持っている場所をプッシュしUITextFieldます。は、いくつかの詳細を表示TextViewControllerする を押すことができDetailViewControllerます。

までプッシュするDetailsViewControllerと、ナビゲーション ビュー コントローラー スタックが[RootVC, TextVC, DetailVC]になり、メモリ警告をシミュレートして、TextVCiOS によってメモリから自動的にアンロードされます。

問題 1: iOS が View Controller をアンロードする必要があると判断しました。ユーザーがポップDetailVCして に戻るときTextVC、状態情報 (テキスト フィールドに入力されたテキストなど) をどこに保存すればよいですか? 現在、View Controller がアンロードされてから再ロードされたため、テキスト フィールドは空白に戻ります。

問題 2:テキスト フィールドに戻ってTextVCタップすると、アプリがクラッシュします。ゾンビをオンにすると、テキスト フィールドをタップしたときに、どこかからメッセージを受け取っている人UIViewがいることがわかりました。responderDidBecomeActive:これはARCでもどのように可能ですか? 私のviewDidUnload方法では、テキスト フィールドを nil に設定し、デリゲート プロパティを nil に設定しています。

編集。新しい質問:オーバーライドdidReceiveMemoryWarningTextVCて何もしないようにすることで、すべてを完全に修正しました。1から非常に悪いまでのスケールで、これはどの程度悪いですか?

EDIT 2.冗談ですが、私はばかで、まったく異なるが関連するコードで通知のオブザーバーを削除するのを忘れていました。iOSがあなたのがらくたを捨てたときに、状態情報がどのように/どこに保存されることになっているのか、まだわかりません。

4

1 に答える 1

2

これを考える方法は次のとおりです。viewDidUnloadを取得すると、システムはすべてのUI要素を削除しました。ビューに戻ると、システムはペン先をリロードし、viewDidLoadを(再び)取得します。明らかに、すべてのデータと設定が失われます。

これに対する解決策は、アンロードされる可能性のある任意のviewConrollerにあり、ユーザーが入力または設定したデータをivarsに保存します。たとえば、テキストをNSStringに保存します。viewDidLoadで、その文字列を確認できます。データが含まれている場合は、テキストフィールドを初期化します。

私があなたに言ったことはすべてios5に関連しています。Appleは将来これに関して何をするかを変えるだろうが、WWDCで学んだことは非公開であるため、ここでそれについて実際に話すことはできない。とは言うものの、WWDCのビデオを見たり、プライベート開発者リストを読んだりすることで、おそらくすぐに見つけることができます。あなたはあなたが学ぶことについて本当に幸せでなければなりません!

于 2012-08-17T12:06:27.607 に答える