2013-02-20 1 views
0

Поскольку у меня есть требование добавить подобные объекты в массив, я создал новый словарь таким образом.Изменение содержимого нового словаря также изменяет данные родительского словаря

NSMutableDictionary* existingStepDict = [[[arrayForSteps objectAtIndex:0] mutableCopy] autorelease]; 
[arrayForSteps addObject:existingStepDict]; 
[existingStepDict release]; 

Теперь, что происходит здесь в том, что позже, когда я что-то изменить в любой из словаря, другой также обновляется. Я требую, чтобы оба этих словаря действовали независимо.

Для этого я прошел через Deep-copy словарей, код которых подобен этому.

NSMutableDictionary* existingStepDict = [[[arrayForSteps objectAtIndex:0] mutableCopy] autorelease]; 

    NSMutableDictionary* destination = [NSMutableDictionary dictionaryWithCapacity:0]; 

    NSDictionary *deepCopy = [[NSDictionary alloc] initWithDictionary:existingStepDict copyItems: YES]; 
    if (deepCopy) { 
     [destination addEntriesFromDictionary: deepCopy]; 
     [deepCopy release]; 
    } 
    //add Properties array to Steps Dictionary 
    [arrayForSteps addObject:destination]; 

Но это тоже не отражало разницу. Я знаю, что делаю здесь небольшую ошибку. Но может ли кто-нибудь помочь мне получить мой результат?

Большое спасибо!

+0

Я редактирую свой предыдущий ответ, чтобы включить другой вариант – tkanzakic

ответ

2

Существует простой способ получить полный deepcopy NSDictionary o NSArray с использованием протокола NSCoding (serialization).

- (id) deepCopy:(id)mutableObject 
{ 
    NSData *buffer = [NSKeyedArchiver archivedDataWithRootObject:mutableObject]; 
    return [NSKeyedUnarchiver unarchiveObjectWithData: buffer]; 
} 

Таким образом, вы можете дублировать любой объект и все объекты, которые он содержит за один шаг.

+0

Хорошо, это сработало отлично. Большое спасибо! – mayuur

1

, когда мне нужен изменяемая глубокая копия NSDictionary создать категорию с этим методом:

- (NSMutableDictionary *)mutableDeepCopy 
{ 
    NSMutableDictionary *returnDict = [[NSMutableDictionary alloc] initWithCapacity:[self count]]; 
    NSArray *keys = [self allKeys]; 

    for (id key in keys) { 
     id oneValue = [self valueForKey:key]; 
     id oneCopy = nil; 
     if ([oneValue respondsToSelector:@selector(mutableDeepCopy)]) { 
      oneCopy = [oneValue mutableDeepCopy]; 
     } else if ([oneValue respondsToSelector:@selector(mutableCopy)]) { 
      oneCopy = [oneValue mutableCopy]; 
     } 
     if (oneCopy == nil) { 
      oneCopy = [oneValue copy]; 
     } 

     [returnDict setValue:oneCopy forKey:key]; 
    } 

    return returnDict; 
} 

EDIT и поиск в Интернете, я нашел это, я не проверял

NSMutableDictionary *mutableCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)originalDictionary, kCFPropertyListMutableContainers); 
+0

Спасибо за помощь! Но я попробовал опцию 'mutableDeepCopy', и это не сработало. Но тогда ответ Мальваджио работает отлично! – mayuur