2012-03-19 2 views
1

Постараюсь быть максимально ясно, насколько это возможно:Удаление элементов в NSMutableDictionary удаляет другой словарь

  1. создать 2 MutableDictionary
  2. добавить в обоих из них тот же объект NSMutableArray:

    [self.myList setObject:tempC forKey:keyV]; 
    
    [self.listFiltered setObject:tempC forKey:keyV]; 
    
  3. в другой части кода, я хочу, чтобы очистить один, так что я:

    [self.listFiltered objectForKey:keyV] removeAllObjects]; 
    

Проблема в том, что объекты удаляются в BOTH mutableDictionaries!

+1

bcoz Вы добавляете оба словаря для одного ключа. –

+0

Значит, у них нет копии? Как я могу сделать так, чтобы у обоих были разные копии? –

+0

установить другой ключ для обоих ... –

ответ

2

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

Чтобы исправить это, вам нужно хранить разные NSMutableArray экземпляров в каждом словаре. Самый простой способ сделать это - [NSMutableArray copy], который сделает shallow copy.

И, наконец, имена словарей с именами, заканчивающимися на list, являются плохой практикой.

+0

Работаю, спасибо! Кстати, как бы вы порекомендовали мне называть их? –

+0

'myDictionary' и' dictionaryFiltered' приходят на ум. Если словарь слишком длинный для вас, то 'dict' является приемлемым сокращением и такой же длиной, как' list'. – freespace

2

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

вы можете добавить массив как это .. (Мне кажется, что вы хотите глубокую копию)

NSMutableArray *newArrayOne = [[NSMutableArray alloc] initWithArray:tempC copyItems:YES]; 
[self.myList setObject:newArrayOne forKey:keyV]; 
[newArrayOne release]; 

NSMutableArray *newArrayTwo = [[NSMutableArray alloc] initWithArray:tempC copyItems:YES]; 
[self.listFiltered setObject:newArrayTwo forKey:keyV]; 
[newArrayTwo release]; 

таким образом два разных объекта хранятся там .. это не самый оптимизированный код .. это просто, чтобы вы поняли, что на самом деле происходит за кулисами.

+0

Можете ли вы привести мне пример? –

+0

@ tonio.mg посмотреть на редактирование –

2

Вам необходимо скопировать массив в другой словарь. См. here о том, как вы можете это сделать.