2011-07-31 12 views
0

私はナビゲーションベースのアプリを持っています。画面リストにはUITableViewの書籍リストがあります。書籍のリストは、HTTPリクエストを実行して動的に作成されたプロパティNSArrayにあります。 リストの行の1つをクリックすると、画面の詳細にナビゲートします。この時点でメモリの警告があるとします。 リストに戻ると、viewDidUnloadが呼び出されたのでNSArrayはnilであるため、リストは空になります。iOSメモリ管理 - viewDidUnload

この状況を処理する正しい方法は何ですか? viewDidUnloadNSArrayをnilに設定しないでください。

答えて

1

通常、IBOutlet UI要素のプロパティは除外されます。 -viewDidLoadで再作成できるものを安全にクリーンアップすることもできます。しかし、一般的に言えば、このメソッドは、ビュー・コントローラーではなく、ビューに関連するメモリーをクリーンアップして解放するためのものです。

+0

ので、短い答えは私が右、nilにNSArrayのを設定してはならないということですか?これは、アプリケーションの終了時にのみNSArrayがリリースされることを意味しますか? – Adriana

+0

最初の質問を修正してください。ビューコントローラが破壊されたときに配列が解放されます( '-dealloc'で解放したと仮定します)。ビューコントローラが常にナビゲーションコントローラのスタックにある場合、配列はアプリケーションが終了するまで生き残ります。 –

+0

私はUIViewControllerのサブクラスの ' - (void)dealloc'メソッドで' [super dealloc] 'を呼び出していますので、ビューコントローラは破棄されます。最後の質問:私のモデルで ' - (void)dealloc'メソッドを定義するべきではありませんか?さもなければ、メモリ警告がある場合にデータが失われるでしょう...明確な説明をありがとう:) – Adriana

0

正しい方法は、データをUIViewControllerに格納するのではなく、データを管理する別のオブジェクトに格納することです。

ビューコントローラは、モデルと画面の間のリンクとして機能します。データを格納するために使用しないでください。

+0

これは関連するアドバイスであるかどうかはわかりません。データが「格納されている」ところでは、少なくともビューコントローラでそのデータへの参照が必要です。永続化されていない一時データの場合、データはヒープに格納されます。 Adrianaは、モデルクラスがフェッチを抽象化するために使用されたかどうか、またはモデルクラスで実行されたかどうかを指定しません。 –

+0

質問の方法(そして実際のところ)は、データが取得されてビューコントローラ内に格納されているという感覚を与えるだけです。私はこの種のコードにかなり頻繁に遭遇します。 )それは教育された推測と呼ぶ;) –

+0

それは、それは質問されている質問に対処しません。 –

0

通常は、オブジェクトのNS(可変)配列をvoid dealloc()に設定します。 Nilとリリース(オブジェクトがオートリリースされていない場合)。

uinavigationcontrollerを使用すると、ビューがプッシュされるので、詳細ビューから戻ると、通常、ビューを表示しない限り、以前のデータが更新されます。

私の推測では、HTTPリクエストからメモリを解放する際に問題があると考えられます。

0

配列がviewDidLoadセクションに組み込まれている場合は、それをnilに設定できます。ビューが呼び出されると、ビューが再構築されます。

一般に、viewDidUnloadで何も設定しないでください。これは、viewDidLoadセクションまたはxibファイルで再構築できます。

私が遅延し、初期化をお勧めしますけれども、このような - のviewDidLoadで

- (NSArray *)bookArray { 
    if (bookArray == nil) { 
     bookArray = [[NSArray alloc] init]; 
    } 
    return bookArray; 
} 

その後:

self.bookArray = [NSArray arrayWithOjects:...,nil];