Я пытаюсь использовать NSKeyedArchiver
/NSKeyedUnarchiver
для хранения данных для свойства класса в файле, чтобы сохранить состояние свойства между запусками приложения.Использование NSKeyedArchiver/Unarchiver в пользовательских методах getter/setter
У меня есть свойство, объявленное в MyClass.h как так:
@property (nonatomic, weak) NSDictionary *myDictionary;
и я создал пользовательские методы получения и установки в MyClass.m, чтобы убедиться, что NSDictionary записывается на диск:
-(NSDictionary *)myDictionary {
NSDictionary *dictionary;
NSString *path = [self pathToDataStore];
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
dictionary = [NSDictionary dictionary];
} else {
NSData *archivedData = [NSData dataWithContentsOfFile:path];
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
}
return dictionary;
}
-(void)setMyDictionary:(NSDictionary *)dictionary {
NSString *path = [self pathToDataStore];
NSDictionary *rootObject = [NSDictionary dictionaryWithDictionary:dictionary];
[NSKeyedArchiver archiveRootObject:rootObject toFile:path];
self.myDictionary = dictionary;
}
Это вызывает бесконечный цикл вызовов [self setMyDictionary]
, поэтому я четко делаю что-то неправильно. Но в чем проблема?
+1 Да, но я бы не советовал '@synthesize MyDictionary;', а '@synthesize MyDictionary = _myDictionary,' как использование подчеркиваний стало общепринятой практикой для переменных экземпляра подпирая свойства. Это помогает минимизировать случайные ссылки на ivars, когда вы хотели использовать метод доступа. – Rob
Победа! Я прекратил использовать любой тип '@ synhesize', когда вышел iOS 6, потому что я не видел, где это было необходимо (вместо этого использовал' self.myDictionary' или '_myDictionary'). Я просто добавил '@synthesize myDictionary = _myDictionary', и все работает нормально. – guthook