オブジェクトに対して非同期メソッドを実行していて、リクエストが終了したら、結果をラベルに出力します。私の問題は、リクエストを起動してからオブジェクトを削除すると、setTextメソッドがクラッシュすることです(オブジェクトの割り当てが解除されているため)。
オブジェクトが解放された場合でも、どうすればこのクラッシュを回避できますか?
行うべきテストはありますか?
オブジェクトに対して非同期メソッドを実行していて、リクエストが終了したら、結果をラベルに出力します。私の問題は、リクエストを起動してからオブジェクトを削除すると、setTextメソッドがクラッシュすることです(オブジェクトの割り当てが解除されているため)。
オブジェクトが解放された場合でも、どうすればこのクラッシュを回避できますか?
行うべきテストはありますか?
1)リクエストが完了するまでオブジェクトを削除しないでください:)
2)リクエストをキャンセルします(オブジェクトによっては常に可能とは限りません)
オブジェクトの割り当てが解除され、現在ビュー上のサブビューである場合、ビュー自体が破棄されているため、ラベルの内容を表示する場所がありません。これがなぜそうなるのかはアプリのデザインによって異なりますが、通常、ビューの削除はコードで検出できます。その場合、ビューがなくなったことを知っている場合は、ビューへの参照をnilに設定する必要があります。
ラベルがまだビューに追加されていない場合は、ラベルを保持する必要があります。これにより、ラベルにテキストを設定し、含まれているビューでaddSubviewを呼び出すことができます。
また、ユーザーの操作によってビューが削除される場合は、スピナーを表示し、ユーザーが呼び出したリクエストが進行中であるため、ユーザーがこれを実行できないようにします。
解決策は、「init」または「viewDidLoad」メソッドでNSMutableArrayオブジェクトを作成することです。オブジェクトを削除する場合は、スーパービューから削除した後、必ずこの配列に入れてください。次に、非同期メソッド(結果を出力するためにメインスレッドで実行する方がよい)で、最後に実行するのは[storageArray removeObject:object]であり、それを解放します。
非同期リクエストは、オブジェクトが完了するまでオブジェクトを保持できます。