0

我的问题是当我复制带有对象的数组时,似乎如果我更改复制的数组,原始数组也会更改。下面是我的代码的简化版本。

我有一个对象数组

@interface TimesViewController (){
    NSMutableArray *route1;
}

我在 ViewDidLoad 方法中填充这些对象

route1 = [[NSMutableArray alloc] init];

while (sqlite3_step(statement) == SQLITE_ROW) {       

    StopsOnRoutes *stopOnRoutes = [[StopsOnRoutes alloc] init];

    [stopOnRoutes setStart_time:p_time];
    [stopOnRoutes setStart_route_id:p_route];
    [stopOnRoutes setStart_stop_id:p_stop];
    [stopOnRoutes setStop_time:c_time];
    [stopOnRoutes setStop_route_id:c_route];
    [stopOnRoutes setStop_stop_id:c_stop];
    [stopOnRoutes calc];

    [route1 addObject:stopOnRoutes];
}

但是当我尝试复制 route1 并进行一些更改时,它们在 route1 和 amTimes 中都发生了变化

NSMutableArray *amTimes = [[NSMutableArray alloc] init];
[amTimes addObjectsFromArray:route1];

for(int i = 0; i<amTimes.count; i++){
    [[amTimes objectAtIndex:i] setStop_time:[[amTimes objectAtIndex:i] stop_time]-86400];
    [[amTimes objectAtIndex:i] setStart_time:[[amTimes objectAtIndex:i] start_time]-86400];
}

如何将 route1 复制到 amTimes,所以如果我在 AM 时间更改对象,它不会在 route1 中更改。

4

4 回答 4

2

数组的工作方式只是保存对数组中对象的引用(指针)。因此,当您添加对象时,它不会创建新对象并指向它,它只是指向同一个对象。您想要做的是被称为深拷贝数组,它涉及到处理数组中的每个对象。

当你使用时会发生什么

- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag

数组中的每个对象都发送一个copyWithZone,您可以在要添加到数组中的每个对象中实现copyWithZone,然后执行

[myArray addObject[myObject copy]];

或者你也可以使用

[[NSArray alloc] initWithArray:otherArray copyItems:YES] //You need to implement copyWithZone in the items you want to copy.

这会给你你想要的结果。

于 2013-11-12T21:54:12.420 回答
1

您需要让您的StopOnRoutes类实现NSCopying协议和copyWithZone:方法。此方法需要创建self.

然后你可以这样做:

NSMutableArray *amTimes = [[NSMutableArray alloc] init];
for (StopOnRoutes *obj in route1) {
    [amTimes addObject:[obj copy]];
}
于 2013-11-12T21:53:30.853 回答
0

容器对象不包含添加到它们的对象的副本,它们包含指向对象的指针。如果将同一个对象添加到 2 个数组,则它是两个数组的成员。

如果你想创建一个副本数组,你需要做几件事:

您需要为数组中的对象实现 NSCopying 协议,以便复制它们。

然后,您需要创建一个新的可变数组,其中包含与第一个数组相同数量的元素的空间,遍历第一个数组,复制每个项目,并将其添加到第二个数组。

如果您的数组仅包含支持 NSCopying 的标准系统对象,那么您的工作会更简单。如果您的数组包含不同种类的自定义对象或复杂的自定义对象,那么您可能还有更多工作要做。

于 2013-11-12T21:57:19.087 回答
-1

尝试使用 setArray: 即[amTimes setArray:route1];

于 2013-11-12T21:52:51.760 回答