2012-02-20 12 views
0

私のプログラムは、(実行時にユーザーが決定する)画面に不定な量のビューを追加し、配列にそれらを保存することによってこれらのビューを追跡します。私のビューコントローラNSMutableArrayに格納されたビューを解放する適切な方法は?

for (NSString *equationText in equationData) { 

// creates a FormulaLabel object for every object in the equationData mutable array 

FormulaLabel *tempLabel = [[FormulaLabel alloc] initWithFrame:CGRectMake(frame)]; 
[view addSubview:tempLabel]; 
[balanceItems addObject:tempLabel]; //balance items keeps track of all the views 

私は私のデータを更新するとき、私は、画面上の意見の異なる配置を必要とするので、私は、データの変更を反映する最も簡単な方法は、すべてのビューを削除するだろう考え出しインサイド

現在画面に表示され、更新されたデータから新しいビューを追加します。

(私が知る限り)スーパービューからビューを削除してリリースし、balanceItemsに保存されているオブジェクトを削除する必要があります。次に、新しいビューを初期化し、サブビューに追加して配列に追加する必要があります。ただし、次のコードはエラーを生成します。

for (UIView *view in balanceItems) { 

    [view removeFromSuperview]; 
    [view release]; 
} 

[balanceItems removeAllObjects]; 

スーパービューとアレイからビューを削除する適切な方法は何ですか?それらを作成するときに

+0

エラーは何ですか?どの行? – sch

+0

@sch '[balanceItems removeAllObjects]' – Mahir

+0

これは具体的なエラーはありませんが、不正アクセスと表示されます – Mahir

答えて

0

まず、あなたは正しくビューを解放する必要があります:あなたはinitメソッドでそれを得たので、あなたはそれを所有して

FormulaLabel *tempLabel = [[FormulaLabel alloc] initWithFrame:CGRectMake(frame)]; // retain count is 1 
[view addSubview:tempLabel]; // retain count is 2 
[balanceItems addObject:tempLabel]; // retain count is 3 
[tempLabel relase]; // retain count is 2 

あなたは、tempLabelを解放する必要があります。

次に、ビューを削除すると、ビューは、現在だけでなく、スーパービューと配列保持され

for (UIView *view in balanceItems) { 
    [view removeFromSuperview]; // retain count is 1 
} 
[balanceItems removeAllObjects]; // retain count is 0 => view gets deallocated 

ので、あなたは彼らからそれを削除するときには、割り当て解除されます:あなたは解放する呼び出す必要はありません。

+0

配列はビューの独自のコピーを作成しますか? – Mahir

+0

新しいコピーを作成せず、単にビューを保持します。 – sch

関連する問題