我正在浏览 iOS 5 开头的示例,并尝试对其进行调整以供我使用。我有一个 DataManager 单例对象,它具有以下属性:
@property (nonatomic, strong) NSArray *frequencyArray;
@property (nonatomic, strong) NSMutableArray *networkArray;
当我使用 ARC 时,我的单例看起来像:
- (id)init {
if (self = [super init]) {
_networkArray = [[NSMutableArray alloc] init];
}
return self;
}
+ (id)sharedInstance {
if (sharedDmgr == nil) {
sharedDmgr = [[super allocWithZone:NULL] init];
}
return sharedDmgr;
}
+ (id)allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
我按照示例代码使此类符合 NSCoding 和 NSCopying。我在这个类中创建了两个方法来存档自己,并取消存档自己。那些是:
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingFormat:ARCHIVE_FILE_NAME];
}
- (void)archiveAppData {
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:self forKey:ARCHIVE_DATA];
// [archiver encodeObject:_frequencyArray forKey:DMGR_FREQUENCY_ARRAY];
// [archiver encodeObject:_networkArray forKey:DMGR_NETWORK_ARRAY];
[archiver finishEncoding];
// BOOL success = [data writeToFile:[self dataFilePath] atomically:YES];
NSError *error;
BOOL success = [data writeToFile:[self dataFilePath] options:NSDataWritingAtomic error:&error];
if (!success) {
NSLog(@"Could not write file %@", [error description]);
}
}
- (void)unarchiveAppData {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
sharedDmgr = [unarchiver decodeObjectForKey:ARCHIVE_DATA];
// self.frequencyArray = [unarchiver decodeObjectForKey:DMGR_FREQUENCY_ARRAY];
// self.networkArray = [unarchiver decodeObjectForKey:DMGR_NETWORK_ARRAY];
[unarchiver finishDecoding];
}
我得到错误:
无法写入文件 Error Domain=NSCocoaErrorDomain Code=513 “操作无法完成。(Cocoa 错误 513。) “操作无法完成。不允许操作"}
我用谷歌搜索了一下,发现它指的是修改捆绑包。但是我看不到我在哪里这样做,因为我认为我正在使用我的 [self dataFilePath] 代码写入文档目录。
当我的应用程序退出活动时,我调用 archiveAppData 方法。当我的第一个 viewController 加载时,我调用 unarchiveAppData。正如您从我注释掉的代码中看到的那样,我尝试只对这两个数组进行编码,然后对它们进行解码,而不是对 DataManager 对象本身进行解码,但这似乎也不起作用。对我做错了什么有任何想法吗?谢谢。