2014-10-30 3 views
1

Я пытаюсь создать приложение с Цель C.Сериализация Цель C не работает

Я пытаюсь сериализовать массив, существующий из объектов, и после его десериализации. Внутри объекта есть методы

(id)initWithCoder:(NSCoder *)coder` and `encodeWithCoder:(NSCoder *)coder 

Но, похоже, в "rootObject" пребывания "ноль" в "loadDataFromDisk" -метод

Вот мой код:

#import "Alarm.h" 

@implementation Alarm 

@synthesize array = _array; 
@synthesize time = _time; 
@synthesize coder = _coder; 

-(id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super init]; 
    if(self) 
    { 
     _array = [coder decodeObjectForKey:@"array"]; 
     _time = [coder decodeObjectForKey:@"time"]; 
    } 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)coder 
{ 
    [coder encodeObject:self.array forKey:@"array"]; 
    [coder encodeObject:self.time forKey:@"time"]; 
} 
@end 

Мои сохраненные и загруженные методы:

-(void)saveDataToDisk 
{ 
    NSString * path = [self pathForDataFile]; 
    NSLog(@"Writing alarms to '%@' %lu", path, (unsigned long)array.count); 
    NSMutableDictionary * rootObject; 
    rootObject = [NSMutableDictionary dictionary]; 
    [rootObject setValue:array forKey:@"alarms"]; 
    [NSKeyedArchiver archiveRootObject:rootObject toFile:path]; 
} 

-(void)loadDataFromDisk 
{ 
    NSString *path = [self pathForDataFile]; 
    NSDictionary *rootObject = [NSMutableDictionary dictionary]; 

    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
    // "array" is an array with Objects of "Alarm" 
    array = [rootObject valueForKey:@"alarms"]; 
    NSLog(@"Loaded from : %@ %lu",path ,(unsigned long)array.count); 
} 

Я надеюсь, что кто-то может помочь мне с этим. Спасибо заранее.

+0

Примечание: '@ synhesize' не требуется в течение нескольких лет. – zaph

+0

Какие объекты находятся в 'массиве'? Вы изучили, что написано в файле? – zaph

ответ

0

Вы @synthized хранилище поддержки массива (ivar) как _array. Поэтому вам нужно получить доступ к массиву либо как _array, либо self.array. В saveDataToDisk и loadDataFromDisk он доступен как array.

Чтобы проверить массив кодирования попробовать что-то простое, как это:

NSLog(@"array: %@", self.array); 

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.array]; 
NSLog(@"data: %@", data); 

NSArray *recovered = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
NSLog(@"recovered: %@", recovered); 

Примечание: Там нет необходимости, чтобы обернуть массив в NSMutableDictionary.

Когда это работает, измените его на вызовы метода на основе файлов.
Убедитесь, что файлPath действителен.
Убедитесь, что файл создан.
Проверьте, чтобы содержимое файла было таким же, как в приведенном выше тестовом коде. Примечание: нет никаких причин для переноса массива в NSMutableDictionary.