Удаление элементов в NSMutableDictionary - удаление другого словаря - PullRequest
1 голос
/ 19 марта 2012

Я постараюсь быть максимально ясным:

  1. Я создаю 2 MutableDictionary
  2. Я добавляю к ним обоим один и тот же объект NSMutableArray:

    [self.myList setObject:tempC forKey:keyV];
    
    [self.listFiltered setObject:tempC forKey:keyV];
    
  3. В другой части кода я хочу очистить один, поэтому я делаю:

    [self.listFiltered objectForKey:keyV] removeAllObjects];
    

Проблема в том, чтообъекты удаляются в ОБОИХ изменяемых словарях!

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

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

2 голосов
/ 19 марта 2012

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

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

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

2 голосов
/ 19 марта 2012

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

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

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];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...