Ошибка «метод мутации отправлен в неизменяемый объект» - PullRequest
1 голос
/ 19 апреля 2011

Я не могу понять, что вызывает это. По сути, несколько разных «задач» сталкиваются друг с другом в моем приложении. Когда я нажимаю кнопку, он запускает этот код просто отлично:

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];




[dataCenter.colourPalettesContainer addObject:[NSNumber numberWithInt:5]];

Он может делать это столько раз, сколько мне нравится. Но когда я выполняю другую задачу (и есть несколько, которые вызывают это), которая включает в себя этот код, например:

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];

[dataCenter.colourPalettesContainer removeObjectAtIndex:touchDownID];

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:dataCenter.colourPalettesContainer forKey:@"container"];
[prefs synchronize];

и затем:

dataCenter.colourPalettesContainer = [prefs objectForKey:@"container"];

Когда я снова запускаю первый код после этого, это вызывает сбой с ошибкой «метод мутации отправлен в неизменяемый объект». Как я могу это остановить?

РЕДАКТИРОВАТЬ: Итак, я обнаружил проблему из некоторых ответов ниже. У кого-нибудь есть другой способ сделать это, который они предложили бы?

Ответы [ 3 ]

6 голосов
/ 19 апреля 2011

NSUserDefaults возвращает неизменный массив.Вам нужно сделать изменяемую копию этого файла, когда вы загрузите его обратно:

NSMutableArray *mutableArray = [[prefs objectForKey:@"container"] mutableCopy];
dataCenter.colourPalettesContainer = mutableArray;
[mutableArray release];

Возможно, вам также придется выполнить некоторые манипуляции внутри массива, поскольку вы хранили в нем NSMutableArrays.

2 голосов
/ 19 апреля 2011

NSUserDefaults всегда возвращает неизменные объекты, даже если то, что вы сохранили, было изменяемым.Чтобы обойти это, вам нужно сделать изменчивую копию.Поскольку -mutableCopy возвращает объект, которым владеет вызывающая сторона, его необходимо (автоматически) освободить:

dataCenter.colourPalettesContainer = [[[prefs objectForKey:@"container"] mutableCopy] autorelease];

( Edit ) Я опубликовал некоторые -mutableDeepCopy.Методы некоторое время назад, в ответ на другой вопрос.Если ваша проблема связана с более глубоким вложением коллекций, и вам нужно, чтобы они all были изменяемыми, это может помочь.

0 голосов
/ 30 мая 2017

УДАЛИТЬ ОБЪЕКТ ИЗ ОСОБЕННОГО ИНДЕКСА Массива. (Swift 3.0)

let fullArray : NSArray = Userdefaults().value(forKey: "YOUR_ARRAY_STRING") as! NSArray
var mutableArray : [AnyObject] = fullArray as [AnyObject]
mutableArray.remove(at: INDEX_TO_REMOVE) //Eg: mutableArray.remove(at: 0)
mutableArray.append(ARRAY_TO_APPEND)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...