NSKeyedUnarchiver unarchiveObjectWithFile を使用して、decodeBytesForKey について少し助けが必要です。すべてを正しく書き込んでいるように見えますが、データを読み取ると EXC_BAD_ACCESS エラーが発生します。データを逆シリアル化しようとしていますが、さまざまな回答や例に混乱しています。誰かが私が間違っていることを指摘できますか?
for (NSString *item in directoryContent){
if ([[item pathExtension] isEqualToString:@"template"]) {
**// Next line is the problem line from the calling code:**
templateToRead = [[NSKeyedUnarchiver unarchiveObjectWithFile:[documentsDirectory stringByAppendingPathComponent:item]] mutableCopy];
IDImageTemplate *template = [[IDImageTemplate alloc] init];
template.templateData = templateToRead.templateData;
template.templateQuality = templateToRead.templateQuality;
template.templateSize = templateToRead.templateSize;
template.templateLocation = templateToRead.templateLocation;
[templatesRead addTemplate:template];
}
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeInteger:self.templateSize forKey:@"templateSize"];
[encoder encodeBytes:(const unsigned char*)self.templateData length:self.templateSize forKey:@"templateData"];
[encoder encodeInt:self.templateQuality forKey:@"templateQuality"];
[encoder encodeInt:self.templateLocation forKey:@"templateLocation"];
}
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self) {
self.templateSize = [decoder decodeIntegerForKey:@"templateSize"];
**// Next line is where the real problem is:**
self.templateData = (const char *)[decoder decodeBytesForKey:@"templateData" returnedLength:(NSUInteger *)self.templateSize];
self.templateQuality = [decoder decodeIntForKey:@"templateQuality"];
self.templateLocation = [decoder decodeIntForKey:@"templateLocation"];
}
return self;
}
データのエンコーダーとデコーダーの行をコメントアウトすると、他のすべての正しい値が返されますが、データも必要です。