Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios addObjectsFromArray不会将它们作为新对象添加_Ios_Arrays - Fatal编程技术网

Ios addObjectsFromArray不会将它们作为新对象添加

Ios addObjectsFromArray不会将它们作为新对象添加,ios,arrays,Ios,Arrays,我的问题是,当我复制一个包含对象的数组时,似乎如果我更改复制的数组,原始数组也会更改。下面是我的代码的简化版本 我有一个对象数组 @interface TimesViewController (){ NSMutableArray *route1; } 我在ViewDidLoad方法中填充这些对象 route1 = [[NSMutableArray alloc] init]; while (sqlite3_step(statement) == SQLITE_ROW) {

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

我有一个对象数组

@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];
}
NSMutableArray*amTimes=[[NSMutableArray alloc]init];
[amTimes addObjectsFromArray:route1];

对于(int i=0;i尝试使用setArray:e.
[amTimes setArray:route1];
您需要让您的
StopOnRoutes
类实现
NSCopying
协议和
copyWithZone:
方法。此方法需要创建
self
的副本

然后你可以这样做:

NSMutableArray *amTimes = [[NSMutableArray alloc] init];
for (StopOnRoutes *obj in route1) {
    [amTimes addObject:[obj copy]];
}

数组的工作方式是,它们只保留对数组中对象的引用(指针)。因此,当您添加对象时,它不会创建新对象并指向它,它只是指向同一个对象。您要做的是将其称为深度复制数组,这涉及到处理数组中的每个对象

这就是当你使用

- (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.

这将为您提供所需的结果。

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

如果要创建副本数组,需要执行以下几项操作:

您需要为阵列中的对象实现NSCopying协议,以便可以复制它们

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


如果您的数组只包含支持NSCOPY的标准系统对象,则您的工作更简单。如果您的数组包含不同类型的自定义对象或复杂的自定义对象,则您可能有更多的工作要做。

您需要创建数组中每个对象的副本。@rmaddy为什么我不能使用
addObjectsFromArray
?因为这不会创建对象的新实例。它只是添加对现有对象的引用。@rmaddy是否有一种方法可以单独添加所有对象?这不会创建一组新的对象。我从未注意到
initWithArray:copyItems:
方法。这比我建议的循环要简单一些。@rmaddy它可能很方便,我编辑了我的回复以将其用作解决方案。应该注意的是,您仍然需要一个
copyWithZone:
方法。@OscarGomez抱歉,我没有注意到这一点!谢谢!