сбой при вставке объекта в массив - PullRequest
0 голосов
/ 17 июня 2011

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

        NSArray *array=[NSArray arrayWithContentsOfFile:plistPath];
        NSLog(@"array before %@",array);
        NSMutableArray *tempArray=[[NSMutableArray alloc]init];
        tempArray=(NSMutableArray*)array;
        NSMutableDictionary *dictToBeChanged=[[NSMutableDictionary alloc]init];
        dictToBeChanged=[tempArray objectAtIndex:indexPath.row];
        [dictToBeChanged setObject:[NSNumber numberWithBool:YES] forKey:@"isPaid"];
        [tempArray removeObjectAtIndex:indexPath.row];
        [tempArray insertObject:dictToBeChanged atIndex:indexPath.row];
        NSLog(@"array after %@",tempArray);

Ответы [ 4 ]

2 голосов
/ 17 июня 2011

Когда вы присваиваете array для tempArray, вы не делаете его изменяемым только потому, что его разыгрываете.

Это NSArray, поэтому вы не можете добавлять / удалять его объекты.

Кроме того, есть несколько ненужных инициализаций (tempArray и dictToBeChanged), поскольку вы перезаписываете эти переменные чем-то другим сразу после инициализации (таким образом, создавая утечки).

Что вам нужно, вероятно, что-то вроде этого:

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath];
NSMutableDictionary *dictToBeChanged = [[[array objectAtIndex:indexPath.row] mutableCopy] autorelease];
[dictToBeChanged setObject:[NSNumber numberWithBool:YES] forKey:@"isPaid"];
[array replaceObjectAtIndex:indexPath.row withObject:dictToBeChanged];

Обратите внимание, что этот код не выполняет никаких проверок содержимого вашего списка.

1 голос
/ 17 июня 2011

Вы смотрите на проблему управления памятью. Попробуйте это:

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath];//Temp array is unecessary
NSMutableDictionary *dictToBeChanged; //No need to allocate a new instance

Не имеет прямого отношения, но:

Оба ваших вызова alloc [init] не нужны и вызывают утечки. По сути, вы создаете новый пустой массив с выделением и присваиваете его переменной. Затем вы немедленно присваиваете свою переменную другому массиву, теряя ссылку на пустой массив / словарь, который вы только что создали, что означает, что он не может быть освобожден. Если вы позже вызываете release в своем коде, это вызовет проблемы.

1 голос
/ 17 июня 2011

попробуйте

  NSMutableArray *temp;
temp=[temp arrayByAddingObjectsFromArray:(NSArray *)otherArray];
1 голос
/ 17 июня 2011

Вы можете добавить объекты в tempArray как temparray следующим образом:

[tempArray addObjectsFromArray:array];
...