Хранение пользовательского объекта в NSMutableDictionary - PullRequest
2 голосов
/ 11 апреля 2011

Я пытаюсь сохранить пользовательский объект в NSMutableDictionary.После сохранения, когда я читаю объект из NSMutableDictionary, он всегда равен нулю.

Вот код

// Сохранение

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

CustomObject *obj1 = [[CustomObject alloc] init];
obj1.property1 = @"My First Property";

[dict setObject:obj1 forKey:@"FirstObjectKey"];
[dict writeToFile:[self dataFilePath] atomically:YES];

// Чтение

 NSString *filePath = [self dataFilePath];
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

        CustomObject *tempObj = [dict objectForKey:@"FirstObjectKey"];

        NSLog(@"Object %@", tempObj);
        NSLog(@"property1:%@,,tempObj.property1);

Как сохранить объект пользовательского класса в NSMutableDictionary

Ответы [ 2 ]

7 голосов
/ 11 апреля 2011

Проблема не в том, чтобы поместить объект в словарь;проблема заключается в записи его в файл.

Ваш пользовательский класс должен быть serializable .Вам необходимо реализовать протокол NSCoding , чтобы Cocoa знала, что делать с вашим классом, когда вы просите записать его на диск.

Это довольно просто сделать;вам нужно реализовать два метода, которые будут выглядеть примерно так:

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    // If inheriting from a class that implements initWithCoder:
    // self = [super initWithCoder:coder];
    myFirstIvar = [[coder decodeObjectForKey:@"myFirstIvar] retain];
    mySecondIvar = [[coder decodeObjectForKey:@"mySecondIvar] retain];
    // etc.

    return self;
}

- (void)encodeWithCoder:(NSCoder *)coder {
    // If inheriting from a class that implements encodeWithCoder:
    // [super encodeWithCoder:coder];
    [coder encodeObject:myFirstIvar forKey:@"myFirstIvar"];
    [coder encodeObject:mySecondIvar forKey:@"mySecondIvar"];
    // etc.
}

По сути, вы просто перечисляете ивары, которые необходимо сохранить, и затем читаете их обратно правильно.

ОБНОВЛЕНИЕ: Как упомянул Eimantas, вам также понадобится NSKeyedArchiver.Для сохранения:

NSData * myData = [NSKeyedArchiver archivedDataWithRootObject:myDict];
BOOL result = [myData writeToFile:[self dataFilePath] atomically:YES];

Для перезагрузки:

NSData * myData = [NSData dataWithContentsOfFile:[self dataFilePath]];
NSDictionary * myDict = [NSKeyedUnarchiver unarchiveObjectWithData:myData];

Я думаю, что должно это сделать.

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

writeToFile метод может хранить только стандартные типы объектов в plist.Если у вас есть пользовательский объект, вы должны использовать для этого NSKeyedArchiver / NSKeyedUnarchiver.

...