在一个数组中插入会影响其他数组吗?

时间:2015-10-22 10:52:14

标签: ios objective-c arrays

我有2 NSMutableArray。我在其中添加自定义类对象。我已将它们初始化如下。

 arr_post=[[NSMutableArray alloc]init];
 copy_arr_user_post=[[NSMutableArray alloc]init];

我正在将对象添加到它们中。

for(i=0;i<[arr_main count];i++)
{
    Post *obj=[[Post alloc]init];
    obj.name=@"abc";
    obj.gender=@"male";
   [arr_post addObject:obj];
   [copy_arr_user_post addObject:obj];

}

现在当我从arr_post&amp;移除对象时再次插入然后它也会在另一个数组中生效。

Post *post=[arr_post objectAtIndex:indexPath.row];
[arr_post removeObjectAtIndex:indexPath.row];
post.name=@"def";
[arr_post addObjectAtIndex:indexPath.row];

然后在第二个数组中添加def

3 个答案:

答案 0 :(得分:2)

你误解了数组是如何工作的。

Arrays将引用存储到对象,而不是对象本身。这有点像保留人们的电话号码。如果我有一个包含10个电话号码的列表,并且您有相同的电话号码列表,并且我列表中索引1的人移动到新地址,当您在索引1处呼叫您的人并询问他们的地址时,他们将给出你也改变了地址。

两个数组都指向相同的对象。

如果更改其中一个对象的设置,如果在任一阵列中查找对象,您将看到这些更改。

如果您希望数组包含独立对象,请在自定义类中实现NSCopying并使用如下代码:

for(i=0;i<[arr_main count];i++)
{
  Post *obj=[[Post alloc]init];
  obj.name=@"abc";
  obj.gender=@"male";
  [arr_post addObject:obj];
  Post objectCopy = [obj copy]; //create a copy of our object
  [copy_arr_user_post addObject: objectCopy]; //insert copy into other array
}

但是,要做到这一点,你需要教你的自定义Post类符合NSCopying协议,以便它理解copy消息。有关详细信息,请查看NSCopying协议上的文档。

答案 1 :(得分:1)

当然它会影响另一个数组,因为两个数组都包含相同(相同)的对象。

在Objective-C对象中是引用类型。这意味着指针分别存储在指向同一对象的数组中。

如果你想拥有不同的对象,你必须复制它们,例如

[copy_arr_user_post addObject:[obj copy]];

答案 2 :(得分:0)

这是因为数组存储指向数据的指针而不是实际数据。 如果你想拥有一个对象的两个不同副本,你可以使用这个方法:

for(i=0;i<[arr_main count];i++)
{
    Post *obj=[[Post alloc]init];
    obj.name=@"abc";
    obj.gender=@"male";
    NSData* objectData = [NSKeyedArchiver archivedDataWithRootObject: obj];
    Post* obj2= [NSKeyedUnarchiver unarchiveObjectWithData: objectData];
   [arr_post addObject:obj];
   [copy_arr_user_post addObject:obj2];

}

或者您可以简单地声明两个对象:

for(i=0;i<[arr_main count];i++)
{
    Post *obj1=[[Post alloc]init];
    Post *obj2=[[Post alloc]init];
    obj1.name=@"abc";
    obj1.gender=@"male";
    obj2.name=@"abc";
    obj2.gender=@"male";
   [arr_post addObject:obj1];
   [copy_arr_user_post addObject:obj2];

}