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抱歉,我没有注意到这一点!谢谢!