Ваш код не делает то, что, по вашему мнению, делает:
NSMutableDictionary *configure = [[NSUserDefaults standardUserDefaults] objectForKey:@"configure"];
Это устанавливает configure
в качестве значения вашего стандартного значения по умолчанию для значения ключа configure
configure = [NSMutableDictionary dictionary];
Устанавливает configure
в новый пустой словарь, а не в тот, который вы получили по умолчанию для пользователя
[configure setValue:[NSMutableDictionary dictionary] forKeyPath:@"select"] ;
Теперь вы помещаете пустой словарь в качестве значения для ключа select
[configure setValue:[NSMutableDictionary dictionary] forKeyPath:@"select.around"];
Вы добавляете еще один пустой словарь для этого пути ключа
[configure setValue: @"All" forKeyPath:@"select.around.name"];
И вы устанавливаете строковое значение для этого пути ключа
[[NSUserDefaults standardUserDefaults] setObject:configure forKey:@"configure"];
Вытеперь помещаем этот нечетный словарь в NSUserDefaults
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *keyPath = @"configure.select.around";
NSMutableDictionary *aroundConfigure = [[[NSUserDefaults standardUserDefaults] valueForKeyPath:keyPath] mutableCopy];
Это просто пустой изменяемый словарь
[aroundConfigure setObject:@"" forKey:@"name"];
Вы задаете пустую строку для некоторого ключа в этом словаре
[[NSUserDefaults standardUserDefaults] setValue:aroundConfigure forKeyPath:keyPath];
И затем вы устанавливаете этот странный словарь в пользовательские значения по умолчанию.
Что все очень сбивает с толку.
Что вы пытаетесь сделать?
Отредактировано для добавления
Нет смысла предоставлять код, если вы "упростили""если мы не видим, что он должен делать.
Ваше приложение падает, потому что вы пытаетесь изменить пару значений ключа NSDictionary, которая является неизменной вместо NSMutableDictionary.См. Строку 6 вашего следа.
Поскольку вы предоставили «упрощенный» код - я не знаю, где вы это делаете.