1

在我的应用程序中,我为保存在 NSUserDefaults 中的数据创建了一堆对象类。

我通过以下方式获得该项目:

LauncherToDoItem *item = [[ActionHelper sharedInstance] actionList][indexPath.row];

然后我将它传递给编辑视图控制器:

LauncherEditActionViewController *editActions = [[LauncherEditActionViewController alloc] initWithToDoItem:item];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:editActions];
    [self presentViewController:navController animated:YES completion:nil];

在视图控制器中,我有一个表格,显示来自项目的编辑版本的数据。

- (id)initWithToDoItem:(LauncherToDoItem *)toDoItem {
    self=[super initWithStyle:UITableViewStyleGrouped];
    if (self) {
        item = toDoItem;
        editedToDoItem = toDoItem;
    }
    return self;
}

当我编辑它时editedToDoItem它也会写入项目,所以我假设它也在写入数组中的版本?为什么通过编辑其中的 1 个会影响这一切?我还没有将它保存回数组,但值会自动保存。

4

1 回答 1

4

那是因为item和都editedToDoItem 指向同一个对象——并且在内存中的确切位置相同。当您编写item = toDoItem时,您真正在做的是将指针保存toDoItem在变量内部item。它是对原始对象的引用,而不是副本,因为 Objective-C 对象变量是指向内存中对象的指针。


考虑以下代码:

NSMutableString *string = [@"Hello, world!" mutableCopy];
NSMutableString *a = string;
NSMutableString *b = string;

// string, a, and b point to the same exact object.
[string appendString:@" Hi again!"];
NSLog(@"%@", a); // => "Hello, world! Hi again!"
[b appendString:@" Whoa!"];
NSLog(@"%@", a); // => "Hello, world! Hi again! Whoa!"

当您从数组中获取项目,然后将其存储在编辑控制器中两次时,您只是在传递对同一个对象的引用,当编辑时,它将反映您拥有的所有其他引用——因为它们指向内存中的相同位置。

如果您真的想要对象的多个不同副本(以便编辑一个不会影响其他副本),您必须通过使它们符合NSCopying 协议并使用[item copy].

于 2013-08-21T02:50:45.447 回答