2014-12-10 7 views
0

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

NSMutableArray *events = [NSMutableArray array]; 
NSMutableDictionary *event = [[NSMutableDictionary alloc]init]; 
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"Update"]]; 

for (int i = 0; i < [array count]; i = i + 2){ 

    [event setValue:[array objectAtIndex:i+1] forKey:@"Event-Type"]; 
    [event setValue:[array objectAtIndex:i] forKey:@"date"]; 
    [events addObject:event]; 

} 

ответ

2

Вы бы выделить новый NSMutableDictionary каждой итерации цикла, либо в начало каждого цикла (т. е. просто переместить эту строку в цикл), или когда вы делаете addObject, вы можете скопировать словарь, используя [NSDictionary dictionaryWithDictionary: event];

Это потому, что NSMutableDictionary - это объект; Он передается по ссылке. Таким образом, вы просто помещаете один и тот же экземпляр NSMUtableDictionary в свой массив n раз.

Вы можете увидеть это, зарегистрировав объект в каждом индексе вашего массива в конце, и вы можете проверить адрес памяти, чтобы увидеть, что они все одинаковые.

+1

Большое спасибо, я знал, что это что-то простое. – ctapp1

0

Массивы в объективе C передают ссылки, а не копии. Поэтому, когда вы вызываете [events addObject: event], затем пишите на это же событие позже, после чего оно записывается и добавляется вновь. Просто переместите создание словаря внутри цикла for, и вам должно быть хорошо идти.

0

Вам необходимо указать alloc init ваш словарь внутри цикла, а также добавить примечание в соответствии со стандартом Apple. Всегда используйте setObject: forKey:, если вы используете словарь. Пожалуйста, используйте приведенный ниже код: -

NSMutableArray *events = [NSMutableArray array]; 
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"Update"]]; 

for (int i = 0; i < [array count]; i = i + 2){ 
    NSMutableDictionary *event = [[NSMutableDictionary alloc]init]; 
    [event setObject:[array objectAtIndex:i+1] forKey:@"Event-Type"]; 
    [event setObject:[array objectAtIndex:i] forKey:@"date"]; 
    [events addObject:event]; 
} 
Смежные вопросы