У меня есть класс, в котором я хочу сохранить постоянные настройки во всем приложении. Этот класс определяется как:
@interface Archive : NSCoder <NSCoding> {
NSString *fromAddress;
NSString *toAddress;
... more ...
}
@property(nonatomic,retain) NSString *fromAddress;
@property(nonatomic,retain) NSString *toAddress;
+ (Archive *)sharedArchive;
-(void)encodeWithCoder:(NSCoder *)aCoder;
-(id)initWithCoder:(NSCoder *)aDecoder;
И реализовано как:
@synthesize fromAddress, toAddress;
+ (Archive *)sharedArchive
{
if (sharedArchive == nil) {
NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:@"mydata"];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
sharedArchive = [unarchiver decodeObjectForKey:@"myapp"];
[unarchiver finishDecoding];
}
return sharedArchive;
}
+ (id)allocWithZone:(NSZone *)zone
{
sharedArchive = [super allocWithZone:NULL];
return sharedArchive;
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax;
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.fromAddress forKey:@"fromAddress"];
[aCoder encodeObject:self.toAddress forKey:@"toAddress"];
}
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [self initWithCoder:aDecoder];
fromAddress = [[aDecoder decodeObjectForKey:@"fromAddress"] retain];
toAddress = [[aDecoder decodeObjectForKey:@"toAddress"] retain];
return self;
}
Метод приложения-делегата applicationWillTerminate:
- (void)applicationWillTerminate:(UIApplication *)application {
/*
Called when the application is about to terminate.
See also applicationDidEnterBackground:.
*/
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:[Archive sharedArchive] forKey:@"myapp"];
[archiver finishEncoding];
[data writeToFile:@"myapp" atomically:YES];
}
Я новичок в этой концепции архивирования / разархивирования. Проблема в том, что я не могу прочитать обратно из файла данных. Я получаю следующую ошибку:
- [NSKeyedUnarchiver initForReadingWithData:]: данные имеют значение NULL
Может ли кто-нибудь объяснить, что я делаю не так? Или, возможно, лучший способ сохранить / восстановить постоянные данные. Я изучил класс NSUserDefaults, но не думаю, что это подходит для моего случая ... Я не пытаюсь сохранить пользовательские настройки.