0

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

这是我的功能:

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

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

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

}

customWorkout 是最初创建 NSMutableArray 的东西(基于用户点击的内容)。因此,如果我的第一个数组由 blah1、blah2 组成,那么这两个值将存储在锻炼数组中。但是,如果我然后单击 blah2、blah 3,则锻炼数组将有两个相同的数组(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 对象插入到锻炼数组中......(因此它是相同的指针)而您需要做的是创建 customWorkout 数组的副本,然后将其插入到锻炼数组中……试试这个……

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

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

于 2012-04-10T21:04:50.817 回答
0

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

您需要:

  • 将对象存储在ORcustomWorkout中时通过以下方式复制对象:copyworkouts
  • 每次执行后分配customWorkout给一个新实例NSMutableArraysaveWorkout

任何一条路线都应该阻止您修改NSMutableArray您存储到workouts集合中的内容。第一个选项在内存管理方面可能更清楚......

于 2012-04-10T21:11:11.660 回答