カスタム オブジェクトをアーカイブしたいと考えています。ClassA は、値が ClassB のインスタンスであるディクショナリを保持します。
ClassA の initWithCoder ではすべてが適切に見え、_dictionary が宣言されstrong
ていますが、init が戻って を呼び出した後callMeAfterInit
、_dictionary は空です (null ではなく、有効な空の辞書)。
これは単純なはずですが、私はアーカイブをあまり使用していないため、基本的なものが欠けている可能性があります。init が戻った後に辞書が空になる原因は何ですか?
重要なコードは次のとおりです。
@interface ClassA : NSObject <NSCoding>
@property (strong, nonatomic) NSMutableDictionary *dictionary;
@end
@implementation ClassA
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.dictionary forKey:@"dictionary"];
}
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self) {
_dictionary = [decoder decodeObjectForKey:@"dictionary"];
// breakpoint here and I can inspect a good dictionary, full of ClassB values
}
return self;
}
- (void)callMeAfterInit {
NSLog(@"%@", self.dictionary);
// Log output here shows an empty dictionary (valid, but with 0 pairs)
}
@end
@interface ClassB : NSObject <NSCoding>
@property (strong, nonatomic) NSNumber *number;
@property (strong, nonatomic) NSArray *array;
@end
@implementation ClassB
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.number forKey:@"number"];
[encoder encodeObject:self.array forKey:@"array"];
}
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self) {
_number = [decoder decodeObjectForKey:@"number"];
_array = [decoder decodeObjectForKey:@"array"];
}
return self;
}
@end