2016-04-28 131 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說。

相關問題