如何编码/解码具有自定义对象数组的自定义对象?

时间:2016-05-17 00:32:20

标签: ios objective-c nsdictionary nscoding

我有一个自定义对象,其中包含另一组自定义property对象的NSArrayNSDictionary。当我对数组进行编码和解码时,NSDictionary个对象在它们应该具有值时是空的。我读过的所有内容都说NSArray个对象符合NSCoding,但我觉得必须要做的更多事情才能正确编码NSDictionary NSArray内的@interface Game : NSObject <NSMutableCopying, NSCoding> @property int rows; @property int cols; @property NSMutableArray *troughs; - (void)encodeWithCoder:(NSCoder *)encoder { // encoding properties [encoder encodeInteger:rows forKey:@"rows"]; [encoder encodeInteger:cols forKey:@"cols"]; [encoder encodeObject:troughs forKey:@"troughs"]; } - (id)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { rows = (int)[coder decodeIntegerForKey:@"rows"]; cols = (int)[coder decodeIntegerForKey:@"cols"]; troughs = [coder decodeObjectForKey:@"troughs"]; } return self; } 个对象......我错过了什么?

@interface Trough : NSDictionary <NSMutableCopying, NSCoding>
@property int col;
@property int row;
@property BOOL isLocked;
@property NSMutableArray *tokens;

- (void)encodeWithCoder:(NSCoder *)encoder {
    // encoding properties
    [encoder encodeInteger:col forKey:@"col"];
    [encoder encodeInteger:row forKey:@"row"];
    [encoder encodeBool:isLocked forKey:@"isLocked"];
    [encoder encodeObject:tokens forKey:@"tokens"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        col = (int)[coder decodeIntegerForKey:@"col"];
        row = (int)[coder decodeIntegerForKey:@"row"];
        isLocked = [coder decodeBoolForKey:@"isLocked"];
        tokens = [coder decodeObjectForKey:@"tokens"];
    }
    return self;
}

槽数组包含定义为:

的对象
{{1}}

1 个答案:

答案 0 :(得分:1)

继承NSDictionary非常不寻常。如果那些NSCopying实现有任何工作机会,他们也需要调用继承的行为。

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder:aCoder];
    // encode your Trough properties
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        // decode your trough properties
    }
    return self;
}