2015-01-24 1 views
2

Я пробовал все, что я могу придумать, и все предложения, приведенные для исправления этой ошибки. Приложение отлично работает на iOS-симуляторе, но оно падает на физическом устройстве (мой iPhone 5).метод мутирования, отправленный на неизменяемый объект, происходит только на физическом устройстве

Здесь ошибка я получаю:

2015-01-23 16:26:43.232 Kyle's App[2343:773183] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 

Декларация свойств этого класса являются:

@property (strong, nonatomic) NSUserDefaults *defaults; 

@property (strong, nonatomic) NSMutableArray *classes; 

@property (strong, nonatomic) NSMutableArray *foundClasses; 

все они инициализируются изменяемых объектов, для пользователя по умолчанию за исключением и метод, в котором возникает ошибка:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSMutableArray *notes = [[NSMutableArray alloc] initWithArray:self.classes[indexPath.row][@"notes"]]; 
    [notes addObject:[[self.defaults objectForKey:@"New Note"] mutableCopy]]; 

    self.classes[indexPath.row][@"notes"] = [notes mutableCopy];//problem 

    [self.defaults setObject:@(indexPath.row) forKey:@"Current Class"]; 

    [self.defaults setObject:self.classes forKey:@"Classes"]; 
    [self.defaults setObject:[self.defaults objectForKey:@"New Note"] forKey:@"Current Note"]; 
    [self.defaults setObject:@YES forKey:@"Created New Note"]; 
    [self.defaults synchronize]; 

    [self performSegueWithIdentifier:@"Show Summary" sender:self]; 
} 

Линия который производит ошибку self.classes[indexPath.row][@"notes"] = [notes mutableCopy];//problem

Вся помощь очень ценится, и я приношу свои извинения, если что-то не так, так как это моя первая публикация на StackOverflow. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо.

UPDATE- У меня есть код, в котором словарь инициализирован, и я не уверен, как он по-прежнему неизменен.

[self.classes addObject:(NSMutableDictionary *)@{ 
           @"title": textField.text, 
           @"notes": [[NSMutableArray alloc] init]//(NSMutableArray *)@[] 
           }]; 
+2

Где код, в который вы помещаете словари в 'self.classes'? Вы должны быть уверены, что добавляете 'NSMutableDictionary', а не' NSDictionary'. – rmaddy

+0

Ваш массив заметок является изменчивым массивом, поэтому метод 'mutableCopy' не нужен – stosha

+0

Попробуйте это 'self.classes [indexPath.row] [@" notes "] = [notes copy];' – Saif

ответ

1

Убедитесь, что вы положили изменяемую версию (NSMutableDictionary, NSCache и т.д.) NSDictionary в массиве classes.

[self.classes addObject:[NSMutableDictionary dictionary]]; 

EDIT: Это не правильный способ преобразовать неизменный объект в его изменчивой эквивалент. Вы должны позвонить [mutableCopy] вместо кастинга.

[self.classes addObject:[@{ 
          @"title": textField.text, 
          @"notes": [[NSMutableArray alloc] init]} mutableCopy]]; 
+0

Я попытался ввести cast the object , который я опубликовал выше, я все еще получаю ошибку. Какие-либо предложения? – kasandell

+0

Как мне сделать объекты, чтобы сделать их изменяемыми @ozgurv? – kasandell

+0

@kasandell вы можете отправить сообщение '[object mutableCopy]' получателю. – ozgur

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