2016-04-28 107 views
-1

这里是我的arrayResult(NSMutableArray):从NSMutableArray的复制对象到另一个的NSMutableArray

<__NSArrayM 0x7fd160e365f0>(
{ 
    Amount = 00; 
    Carat = 00; 
    Color = D; 
    Cut = EX; 
    Discount = 00; 
    IsSelected = 1; 
    Quality = IF; 
    Rate = 00; 
    Shape = RBC; 
    StoneNo = ""; 
    Symme = EX; 
}, 
{ 
    Amount = 00; 
    Carat = 00; 
    Color = D; 
    Cut = EX; 
    Discount = 00; 
    IsSelected = 0; 
    Quality = IF; 
    Rate = 00; 
    Shape = RBC; 
    StoneNo = ""; 
    Symme = EX; 
} 
) 

现在我想的objectNSMutableArray复制到另一个NSMutableArray。 对于我使用这个:

[arrayCopyRow addObject:[arrayResult objectAtIndex:0]]; 

但我保存它的地址还,所以如果我改变ValueAtIndex 0它会自动改变它被复制object

我该如何预防?我如何创建深层副本?

+2

你可能要找的东西叫做'deep copy':http://stackoverflow.com/questions/20072729/how-can-i-make-a-deep-copy-in-objective-c – luk2302

回答

-2

使用此代码:

NSMutableArray *array = [yourFirstArray mutableCopy]; 
+0

你怎么样分配你的NSMutableArray? –

0

为此,您将需要一个深层副本。

所以,你可以先运行:

NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES]; 

这将根据苹果的文档和数组中的项目需要符合NSCopying协议创建一个层次深拷贝。

如果您只想复制一个对象,则可以使用newArray作为临时数组,然后创建并初始化一个新的可变数组,然后像在问题中一样移动对象。

要确保使用上述方法将任何自定义对象复制为深层副本,您需要在每个类中添加copyWithZone:方法。

粗糙例如:

-(id) copyWithZone:(NSZone *) zone 
{ 
    ObjectInArray *object = [super copyWithZone:zone]; 
    object.someValue = self.someValue; 
    return object; 
} 
+0

请注意,数组中的项必须符合'NSCopying'! – luk2302

+1

@Willeke不是,'initWithArray:copyItems'是一个深层复制,'arrayWithArray:'是一个浅拷贝。 – luk2302

+0

对不起。我删除了我的评论。 – Willeke

0

把元素的副本到其他阵列。

[arrayCopyRow addObject:[[arrayResult objectAtIndex:0] copy]]; 

[arrayCopyRow addObject:[[arrayResult objectAtIndex:0] mutableCopy]]; 

如果你想要的所有元素的副本,你可以做一个深拷贝像luk2302说。

相关问题