私は Beginning 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 に準拠させました。このクラスには、自分自身をアーカイブするメソッドと自分自身をアーカイブ解除するメソッドを 2 つ作成しました。それらは:
- (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];
}
エラーが発生します:
ファイルに書き込めませんでした エラー Domain=NSCocoaErrorDomain Code=513 「操作を完了できませんでした。(Cocoa エラー 513.)」操作を完了できませんでした。操作は許可されていません"}
私がグーグルで調べたところ、バンドルの変更について言及していることがわかりました。しかし、[self dataFilePath] コードでドキュメント ディレクトリに書き込んでいると思っていたので、どこでそれを行っているのかわかりません。
アプリケーションがアクティブでなくなると、archiveAppData メソッドを呼び出します。最初の viewController が読み込まれるときに、unarchiveAppData を呼び出します。コメントアウトされたコードからわかるように、代わりにこれら 2 つの配列をエンコードしてから、DataManager オブジェクト自体ではなくそれらをデコードしようとしましたが、どちらもうまくいかなかったようです。私が間違っていることについて何か考えはありますか?ありがとう。