0

カスタム オブジェクトをアーカイブしたいと考えています。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
4

1 に答える 1

1

を呼び出すコードは示していないcallMeAfterInitため、これは推測です。

おそらく、あなたは の同じインスタンスと話しているわけではありませんClassA[[ClassA alloc] init];たまたまどこかに電話したの?

于 2013-06-20T17:43:41.980 に答える