0

UIViewControllers私の の 1 つに、UITableView2 つの行しかなく、両方が常に画面に表示される があります。これは、歴史的にはテーブル ビューです (別の開発者がこの方法で作成しましたが、私はそれに固執していません)。my が呼び出されると、テーブルの両方の行が常に表示さcellForRowAtIndexPathれるため、XIB からセルの 1 つを作成し、サブビューの 1 つへの参照を保存します ( UITextView)。そこからテキストを取得する必要がある場合はUITextView、単純にローカル参照を使用します。これは問題なく動作します - ほとんどの場合。

ある特定のケースでは、UIViewControllerこのケースから別のケースに移動します (を使用pushViewController:animated)。その新しいView Controllerはかなりのメモリを使用するため、iOSは内部的に最初のView Controllerからテーブル行の割り当てを解除します(別のView Controllerがアクティブであるため、表示されなくなります)-そして、最初のView Controllerに戻ると、単に呼び出しますcellForRowAtIndexPathまた。その行が解放されると、当然、内部に保存した参照は無効になり、それを使用しようとすると、アプリがクラッシュします (「割り当て解除されたインスタンスに送信されたセレクター」)。

私の質問は、iOS がテーブル セルを内部的に解放するタイミングをキャッチして、参照をnil後で再割り当てできるようにするにはどうすればよいかということです。

4

3 に答える 3

0

どうやら、この問題に対処するために私が見つけた唯一の方法は、含めることです

- (void)didReceiveMemoryWarning;

コールバックし、nilそこへの参照を設定します。これが状況に対処する最善の方法であるかどうかはわかりませんが、うまくいきます。

于 2012-06-28T15:58:58.100 に答える
0

とにかく、iOS MVC の世界では、一般に、問題のビュー以外の目的で UITextView からのデータの取得に依存するべきではありません。他のビューに移動したときに、OS がそのビューで何をするかはわかりません。UITextView からのその文字列を、これらのビュー コントローラーに渡されるか、他のビュー コントローラー (シングルトンまたはアプリ デリゲートのプロパティなど) にアクセスできるオブジェクトに格納するか、永続的なストレージに格納することをお勧めします。

余談ですが、メモリ不足のためにビューが解放された場合、または他のテーブルビューで同じセル識別子を使用しているためにセルがデキューされた場合でも、そのビュー コントローラーはそのままなので、心配する必要はありません。 didReceiveMemoryWarning で明示的に何かをして解放しない限り、そこに設定したプロパティを失うことについて。

于 2012-06-17T18:36:22.080 に答える
0

iOS 5.0 以降では__weak、テキスト フィールドへの参照を使用するのが最も簡単な解決策です。nilオブジェクトの割り当てが解除されると、自動的に設定されます。

以前の iOS バージョンでは、簡単な解決策はありません。UITextFieldorをサブクラス化し、サブクラスのorメソッドをUITableViewCellオーバーライドして、そこからビュー コントローラーにイベントについて通知する通知を送信できます。しかし、私にはかなりあいまいなハックのように思えます。参照が常に有効であることを確認してください。これをin に設定し、必要に応じて後で再作成してください。releasedeallocnilviewDidUnload

于 2012-06-14T09:44:37.707 に答える