0

私は現在、NSMutableArrayをシングルトンクラスから別のNSMutableArrayに保存するsaveWorkoutと呼ばれる関数を持っています。この関数は最初の実行で機能しますが、2回実行すると、以前に要素0に格納されていたものが消去され、新しい配列(ユーザーがテーブルをクリックしたときに収集される文字列のコレクション)に置き換えられます。 。

これが私の関数です:

-(IBAction)saveWorkout{
    WorkoutManager *workoutManager = [WorkoutManager sharedInstance];

    [[workoutManager workouts] insertObject: customWorkout atIndex: 0];

    NSLog(@"%@", [workoutManager workouts]); 

}

customWorkoutは、(ユーザーがクリックしたものに基づいて)NSMutableArrayを最初に作成するものです。したがって、最初の配列がblah1、blah2で構成されている場合、これら2つの値はworkouts配列に格納されます。ただし、次にblah2、blah 3をクリックすると、ワークアウト配列には2つの同一の配列(blah2、blah3)があり、最初の配列は保持されません。なぜこれが起こっているのか考えていますか?

これが私がcustomWorkoutを形成する方法です:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *str = cell.textLabel.text;

    [customWorkout insertObject:str atIndex:0];

    //Test Code: Prints Array
    NSLog(@"%@", customWorkout); 
}
4

2 に答える 2

2

私はあなたが犯している論理的な間違いをあなたに話します...

同じcustomWorkoutオブジェクトを何度も使用してworkouts配列に挿入しています...(したがって同じポインター)が、必要なのはcustomWorkout配列のコピーを作成してから、それをworkout配列に挿入することです。 ...代わりにこれを試してください...。

 [[workoutManager workouts] insertObject: [[customWorkout mutableCopy] autorelease]atIndex: 0];

コードで他のことをしているのでない限り、これは機能するはずです。

于 2012-04-10T21:04:50.817 に答える
0

[[workoutManager workouts] insertObject: customWorkout atIndex: 0];customWorkout...の内容をコピーせず、代わりに。への参照を保持するだけcustomWorkoutです。したがって、コードは同じオブジェクトへの複数の参照を格納しているだけであり、2回目の実行で(意図せずに)編集することになります。

次のいずれかを行う必要があります。

  • ORに保存するときに、をcustomWorkout介してオブジェクトをコピーします。copyworkouts
  • を実行した後、毎回customWorkout新しいインスタンスに割り当てますNSMutableArraysaveWorkout

どちらのルートでも、コレクションNSMutableArrayに保存するものを変更できないようにする必要があります。workouts最初のオプションは、メモリ管理の観点からおそらくより明確です...

于 2012-04-10T21:11:11.660 に答える