Ошибка при использовании setObject в NSMutableDictionary - PullRequest
1 голос
/ 04 января 2012

Я получаю исключение:

- [__NSCFDictionary setObject: forKey:]: метод мутирования, отправленный неизменяемому объекту '

Оскорбительная строка:

[delegate.sharedData.dictFaves setObject:@"test" forKey:@"4"];

Делегат инициализируется таким образом в MyViewController.m:

delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

Вот как определяется мой делегат в AppDelegate.h:

#import "CommonData.h"
...
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    NSString *tempFave;
    CommonData *sharedData;
}
@property (strong, nonatomic) NSString *tempFave;
@property (strong, nonatomic) CommonData *sharedData;

sharedData инициализируется в AppDelegate.m таким образом:

#import "AppDelegate.h"
...
@implementation AppDelegate
@synthesize sharedData;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    sharedData = [[CommonData alloc] init];
    return YES;
}

sharedData определен в CommonData.h:

@interface CommonData : NSObject
{
    NSMutableDictionary *dictAffirms;
    NSMutableDictionary *dictFaves;
}
@property (nonatomic, copy) NSMutableDictionary *dictAffirms;
@property (nonatomic, copy) NSMutableDictionary *dictFaves;

файл реализации общих данных CommonData.m:

#import "CommonData.h"
...
@implementation CommonData

@synthesize dictAffirms;
@synthesize dictFaves;

@end

Я объявил членов CommonData изменчивыми. Видимо, этого недостаточно. Что еще я должен сделать для записи в словари в CommonData?

Ответы [ 3 ]

3 голосов
/ 04 января 2012

Я видел эту ошибку раньше, когда пытался записать в словарь, который заполнен из списка. Если вы используете

yourMutableDictionary = [someDataSource objectForKey:@"someKey"];

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

yourMutableDictionary = [someDataSource mutableArrayValueForKey:@"someKey"];

и ваша проблема исчезнет, ​​если предположить, что на самом деле является вашей проблемой. Это может быть что-то вроде:

yourMutableDictionary = [[NSDictionary alloc] init];

или

yourMutableDictionary = [NSDictionary new];

и вы просто случайно создаете неизменные объекты, что в значительной степени та же проблема, что и выше, просто другая.

Было бы неплохо увидеть код, используемый для инициализации NSMutableDictionaries.

Редактировать: Может быть, попробовать что-то вроде этого, так как мне любопытно, каковы будут результаты. Вместо использования:

[delegate.sharedData.dictFaves setObject:@"test" forKey:@"4"];

попробовать

NSMutableDictionary* dict = [[NSMutableDictionary alloc] initWithDictionary:delegate.sharedData.dictFaves];
[dict setObject:@"test" forKey:@"4"];
delegate.sharedData.dictFaves = dict;
[dict release];
1 голос
/ 10 января 2012

Ваша проблема в том, что ваш установщик свойств для словаря объявлен как copy.Метод copy NSMutableDictionary возвращает неизменный NSDictionary (в общем случае copy почти всегда возвращает неизменный объект).Таким образом, предполагая, что вы используете стандартный синтезатор, каждый раз, когда вы устанавливаете это свойство, вы присваиваете за кадром неправильный тип.Вероятно, вместо этого должно быть strong.

1 голос
/ 04 января 2012

Вы объявили dictFaves изменчивым, но это не значит, что вы фактически хранили изменяемый объект там.Проверьте ваш инициализатор.Вероятно, у вас будет что-то вроде следующего:

dictFaves = [[NSDictionary alloc] init];

Если это так, вам нужно изменить его на NSMutableDictionary.

...