我有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
。
答案 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];
}