2015-06-20 6 views
0

Я перебираю массив, получая два элемента и помещая их в словарь, а затем добавляю их в массив, но он продолжает добавлять последний элемент массива для числовых объектов в массив, даже если при вводе словаря внутри цикла он имеет правильное значение. Вот мой кодNSMutableArray добавляет один и тот же NSDictionary несколько раз

  for (TFHppleElement *element in nodesArray) { 

    [nameAndHrefDict setObject:[element objectForKey:@"href"] forKey:@"href"]; 
    [nameAndHrefDict setObject:[element text] forKey:@"name"]; 
    NSLog(@"PRE: %@", nameAndHrefDict); 
    [arrayOfDicts addObject:nameAndHrefDict]; 
    NSLog(@"IN: %@", arrayOfDicts); 


} 

В журнале я вижу это

PRE: { 
href = "/dining-choices/res/index.html"; 
name = "Commons Dining Hall"; 
} 

IN: (
    { 
    href = "/dining-choices/res/index.html"; 
    name = "Commons Dining Hall"; 
} 
PRE: { 
href = "/dining-choices/res/sage.html"; 
name = "Russell Sage Dining Hall"; 
} 

IN: (
    { 
    href = "/dining-choices/res/sage.html"; 
    name = "Russell Sage Dining Hall"; 
}, 
    { 
    href = "/dining-choices/res/sage.html"; 
    name = "Russell Sage Dining Hall"; 
} 
) 

Что происходит?

Но оно добавляет последнее значение nodeArray 8 раз, вместо каждого значения, почему?

Спасибо за помощь заранее.

+1

вы добавляете же словарю несколько раз. * Конечно * вы получаете несколько копий! –

ответ

0

Вы должны alloc и init массив каждый раз, так что есть новая память для него, а затем это обыкновение добавлять тот же массив 8 раз

1

Пожалуйста, попробуйте:

for (TFHppleElement *element in nodesArray) { 

     [arrayOfDicts addObject:[NSDictionary dictionaryWithObjectsAndKeys:[element objectForKey:@"href"], @"href", [element text], @"name", nil]]; 
} 
+0

отлично, что сработало? но почему раньше не было того, что я делал раньше? Я попытался выделить и инициализировать каждый раз при существовании цикла, и это также заставило его работать, но я не уверен, почему? – spenf10

+0

Вы перезаписываете предыдущие объекты с теми же клавишами. – aobs

+0

правильно, но тогда почему он добавляет этот объект два или три раза? когда его переписали, не прошло? – spenf10

1

Объекты добавляются к массивам по ссылке. Массив не создает копию словаря, он просто сохраняет запись о том, какой словарь был добавлен. Вы добавляете тот же словарь, nameAndHrefDict, в массив каждый раз. Таким образом, массив считает себя одним и тем же объектом несколько раз.

На каждой итерации вы меняете значение этого объекта, но это все тот же объект.

Таким образом, основная проблема заключается в определении стоимости. Массив заполняется личностью. Вы ожидаете, что он будет заполняться по значению.

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

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