Попытка добавить много массивов к одному NSMutableArray - PullRequest
0 голосов
/ 15 февраля 2012

Я пытаюсь здесь добавить множество массивов в один NSMutableArray. На самом деле я добавляю один и тот же массив с разными значениями много раз в один массив NSMutable. это код:

NSMutableArray* wordsArray =[[NSMutableArray alloc] init ];
NSMutableArray* meaningsArray=[[NSMutableArray alloc]init];
NSMutableArray* wordsArrayTemp=[[NSMutableArray alloc]init];
NSMutableArray* meaningsArrayTemp=[[NSMutableArray alloc]init ];
NSMutableArray* allWords =[[NSMutableArray alloc]initWithCapacity:2];
NSMutableArray* allMeanings=[[NSMutableArray alloc]initWithCapacity:2];




 for(int i=0;i<2;i++)
{
    int wordsCounter=0;
     [wordsArrayTemp removeAllObjects];
[meaningsArrayTemp removeAllObjects];


    for(NSString *tmp in wordsArray)
        {  
            NSString *meaning =[meaningsArray objectAtIndex:wordsCounter++];

            subtmp= [ tmp substringWithRange:NSMakeRange(0,1)];

            if([currentTable isEqualToString:@"arabicToEnglish"])
            { 
                if([subtmp isEqualToString:[arabicLetters objectAtIndex:i]])
                {
                    [wordsArrayTemp addObject:tmp];
                    [meaningsArrayTemp addObject:meaning];
                }
            }
            else
                if([subtmp isEqualToString:[englishLetters objectAtIndex:i]])
                { 
                    [wordsArrayTemp addObject:tmp];
                    [meaningsArrayTemp addObject:meaning];
                }    
        }
  [allWords insertObject:wordsArrayTemp atIndex:i];
   // [allWords addObject: wordsArrayTemp];
    [allMeanings addObject:meaningsArrayTemp]; 
  NSLog(@"all words count%i",[[allWords objectAtIndex:i] count]);  
} 

Проблема: Предполагаемое поведение здесь - иметь 2 разных значения в массиве allWords. Но на самом деле происходит то, что 2 значения заполнены одинаковым значением с последним индексом Value. Я имею в виду, что у [allWords objectAtIndex: 0] должно быть 2000 объектов, а у [allWords objectAtIndex: 1] должно быть 3000, но что происходит, когда у них обоих по 3000 объектов !!

что мне здесь не хватает? !! Thnx

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

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

По сути, вы добавили тот же временный массив в родительский массив.И вы сделали все ваши манипуляции с массивом в одном и том же массиве

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

// 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];
0 голосов
/ 26 июля 2013

Попробуйте: -

[allWords insertObject:[wordsArrayTemp copy] atIndex:i];

Должно работать.

0 голосов
/ 15 февраля 2012

Попробуйте добавить один массив одновременно:

[[allWords array] addObject:wordsArray.array];

Надеюсь, это поможет

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