NSMutableArray也会更改副本,从而导致父NSMutableArray发生更改

时间:2013-11-05 09:21:41

标签: ios objective-c

我有一个NSMutableArray是我在我的一个视图控制器中使用的委托。

所以在viewDidLoad中,我像这样制作一个NSMutableArray的可变副本

@implementation ItemsViewController{
    AppDelegate *mydelegate;
    NSMutableArray* allItems;
}

在viewDidLoad

allItems = [mydelegate.array mutableCopy];

现在我在allItems中做出的任何变化MutableArray也会导致我的mydelegate.array发生变化。我做错了吗?

委托中的我的数组也定义如下

@property (nonatomic, strong) NSMutableArray *array;

4 个答案:

答案 0 :(得分:2)

我假设你没有正确实现mutableCopyWithZone。

您需要为放入数组的对象实现NSMutableCopying协议,这样就可以为该情况传递该对象的新实例。

- (id)mutableCopyWithZone:(NSZone *)zone
{
   YourCustomModel *aCopy = [[[self class] allocWithZone:zone] init];
   if (aCopy) {
     // set properties
}
   return aCopy
}

答案 1 :(得分:2)

你应该做一个deepCopy,我使用this one并完美地工作,由Sherm Pendley †制作。

答案 2 :(得分:0)

这是因为数组的可变副本引用了与mydelegate.array引用相同的对象,因此如果更改了一个对象属性,则它在两个数组中都会更改,因为它是同一个对象。

您可以在对象中实现NSCopying协议,然后可以调用initWithArray:copyItems:NSArray方法。

希望有所帮助。

答案 3 :(得分:0)

试试这个。

allitems =[NSMutableArray arrayWithArray:mydelegate.array];