0

私は現在、saveWorkoutと呼ばれる関数を持っています。この関数は、NSMutableArrayをSingletonクラスの別のNSMutableArrayに保存します。この関数は最初の実行を行いますが、2回目に実行すると、以前に要素0に格納されていたものが消去され、新しい配列(ユーザーがテーブルをクリックしたときに収集される文字列の集合です) 。ここでNSMutableArrayは以前に格納された要素を上書きする

は私の関数である。

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

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

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

} 

customWorkoutはinitialially(ユーザーがクリックしたものに基づいて)NSMutableArrayの作成するものです。したがって、私の最初の配列がblah1、blah2で構成されている場合、それらの2つの値はワークアウト配列に格納されます。しかし、私がblah2、blah3をクリックすると、ワークアウト配列には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); 
} 

答えて

2
私はあなたが作っている論理的な間違いを教えてくれます

....

あなた挿入するために何度も繰り返しオブジェクトとcustomWorkout同じを使用していますあなたがする必要があるのは、customWorkout配列のコピーを作成し、それをワークアウト配列に挿入することです。代わりにこれを試してみてください。

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

これはコード内で何か他のことをしていない限りうまくいくはずです。

0

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

  • 割り当てcustomWorkoutあなたがsaveWorkoutを行った後、各時間:

    あなたがいずれかを行う必要があります。copy経由

    • コピーcustomWorkoutオブジェクトあなたがworkouts
      でそれを保存したり、

    workoutsコレクションに保存するNSMutableArrayを変更しないようにしてください。最初のオプションはおそらくメモリ管理の面でより明確です。

  • 関連する問題