2016-04-28 3 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; 
} 
) 

Теперь я хочу, чтобы скопировать object от NSMutableArray других NSMutableArray. Для этого я использую это:

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

Но я храню свой адрес и, поэтому, если я изменю ValueAtIndex 0, что он автоматически изменить это скопировано object.

Как предотвратить это? Как создать глубокую копию?

+2

Что вы, вероятно, ищете, называется «глубокой копией»: 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]; 

Это создаст глубокую копию один уровень в соответствии с Apples документы и элементы в массиве должны будут соответствовать протоколу 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 сказал.

Смежные вопросы