при добавлении объекта в массив объект не копируется.Вы просто сохраняете свой адрес памяти.
По сути, вы добавили тот же временный массив в родительский массив.И вы сделали все ваши манипуляции с массивом в одном и том же массиве
Возможно, этот фрагмент кода развернутого цикла сделает его немного более понятным.
// create new array on a specific memory address. let's say this address is 0x01
NSMutableArray* wordsArrayTemp=[[NSMutableArray alloc]init];
// first iteration of your loop
// remove all objects from array at memory address 0x01
[wordsArrayTemp removeAllObjects];
// add objects to the array at address 0x01
[wordsArrayTemp addObject:tmp];
// insert array (still at address 0x01) to the parent array
[allWords insertObject:wordsArrayTemp atIndex:i];
// your allWords array now looks like this: {array@0x01}
// second iteration of your loop
// remove all objects from array at memory address 0x01!!! (still the same array as in the first iteration)
// since it's the same array all objects from the array at [allWords objectAtIndex:0] are removed too
[wordsArrayTemp removeAllObjects];
// add objects to the array at address 0x01
[wordsArrayTemp addObject:tmp];
// insert array (still at address 0x01) to the parent array
[allWords insertObject:wordsArrayTemp atIndex:i];
// your allWords array now looks like this {array@0x01, array@0x01}
решение довольно простое.
В начале цикла for вместо удаления всех массивов из массива создаются новые массивы.
Просто замените
[wordsArrayTemp removeAllObjects];
[meaningsArrayTemp removeAllObjects];
на
wordsArrayTemp = [NSMutableArray array];
meaningsArrayTemp = [NSMutableArray array];