NSMutableArray覆盖以前存储的元素

时间:2012-04-10 20:52:16

标签: iphone objective-c cocoa-touch memory-management nsmutablearray

我目前有一个名为saveWorkout的函数,它将一个NSMutableArray从Singleton类保存到另一个NSMutableArray。此函数在第一次运行时起作用,但是,当我第二次运行它时,它会擦除​​先前存储在元素0中的内容并将其替换为新数组(当用户单击表时收集的字符串集合) 。

这是我的功能:

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

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

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

}

customWorkout是最初创建NSMutableArray的内容(基于用户点击的内容)。因此,如果我的第一个数组由blah1,blah2组成,那么这两个值将存储在workouts数组中。但是,如果我然后单击blah2,blah 3,则锻炼数组将具有两个identicle数组(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 个答案:

答案 0 :(得分:2)

我会告诉你你正在制造的逻辑错误......

您反复使用相同的customWorkout对象插入到锻炼数组中...(因此它的指针相同)而您需要做的是创建customWorkout数组的副本,然后将其插入锻炼阵列......试试这个......

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

除非您在代码中执行其他操作,否则这应该有效。

答案 1 :(得分:0)

[[workoutManager workouts] insertObject: customWorkout atIndex: 0];不会复制customWorkout的内容...而只是保留对customWorkout的引用。因此,您的代码只是存储对同一对象的多个引用,您最终(无意中)在第二次运行时进行编辑。

您需要:

  • customWorkout对象存储在copy时通过workouts复制
    OR:
  • 每次执行customWorkout
  • 后,将NSMutableArray分配给新的saveWorkout个实例

这两种路线都不会让您修改存储在NSMutableArray集合中的workouts。在内存管理方面,第一个选项可能更清晰......