0

我正在浏览 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 对象本身进行解码,但这似乎也不起作用。对我做错了什么有任何想法吗?谢谢。

4

0 回答 0