1

使用 mutableCopy 复制 NSMutableArray 显然会创建该数组的物理新副本。这一点的证据是使用 removeObjectAtIndex 从副本中删除元素不会从原始元素中删除元素。但是,如果副本中的元素发生更改,则原始元素中的元素也会更改。这就像光的光子既是粒子又是波一样直观,我不明白。请有人可以向我解释一下。

代码如下。

NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
                                 [NSMutableString stringWithString:@"one"],
                                 [NSMutableString stringWithString:@"two"],
                                 [NSMutableString stringWithString:@"three"],
                                 [NSMutableString stringWithString:@"four"],
                                 nil];
    NSMutableArray *dataArray2;
    NSMutableString *mstr;
    dataArray2 = [dataArray mutableCopy];
    [dataArray2 removeObjectAtIndex:0];
    mstr    = [dataArray2 objectAtIndex:0];
    [mstr appendString:@"ONE"];
    NSLog(@"Data Array: ");
    for (NSString *elem in dataArray) {
        NSLog(@"%@",elem);
    }
    NSLog(@"Data Array2: ");
    for (NSString *elem in dataArray2) {
        NSLog(@"%@",elem);
    } 
4

2 回答 2

1

mutableCopy方法创建数组的浅表副本,这意味着对原始数组元素的引用被复制到由NSMutableArray返回的新实例中mutableCopy。这就是为什么操作(添加/删除元素)数组的副本不会改变原始数组的组成,而允许突变的数组元素的更改通过数组的两个副本变得“可见”。

于 2012-11-12T12:33:37.917 回答
0

这是您是更改数组对象还是它引用的对象之一的问题。

假设在非计算机世界中,您在两张不同的纸上都有人名列表。如果您从一个列表中删除名称,它对另一个列表没有影响。相反,如果您给其中一个人一杯咖啡,那么无论您是在列表 A 还是列表 B 上查找他们,这个人都会拥有它。:-)

于 2012-11-12T12:34:19.313 回答