【问题标题】:NSObject doesn't support encodeWithCoder?NSObject 不支持 encodeWithCoder?
【发布时间】:2014-08-04 14:50:29
【问题描述】:

我第一次使用编码是为了从我的应用中保存数据。我一直在看的例子说为自定义类调用[super encodeWithCoder:coder];

我有一个扩展 NSObject 的类,但收到下面的错误消息。这是因为NSObject 是基类,没有要编码的东西吗?

例如消息的接收器类型“NSObject”未声明带有选择器“encodeWithCoder:”的方法

- (void)encodeWithCoder:(NSCoder *) coder 
{ 
[super encodeWithCoder:coder]; //  <-------------------------ERROR

[coder encodeInt:noteIndex forKey:@"noteIndex"];
[coder encodeCGRect:cellRect forKey:@"cellRect"];
[coder encodeBool:noteOn forKey: @"noteOn"]; 
[coder encodeInt:note forKey:@"note"]; 
[coder encodeInt:velocity forKey:@"velocity"]; 
[coder encodeInt:channel forKey:@"channel"];
[coder encodeInt:releaseVelocity forKey:@"releaseVelocity"];
[coder encodeFloat:duration forKey:@"duration"];
}

【问题讨论】:

    标签: ios


    【解决方案1】:

    没错,NSObject 不符合NSCoding,所以它没有实现encodeWithCoder:。幸运的是,NSObject 本身没有任何要编码的数据,所以您所要做的就是:

    - (void)encodeWithCoder:(NSCoder *) coder 
    { 
        [coder encodeInt:noteIndex forKey:@"noteIndex"];
        [coder encodeCGRect:cellRect forKey:@"cellRect"];
        [coder encodeBool:noteOn forKey: @"noteOn"]; 
        [coder encodeInt:note forKey:@"note"]; 
        [coder encodeInt:velocity forKey:@"velocity"]; 
        [coder encodeInt:channel forKey:@"channel"];
        [coder encodeInt:releaseVelocity forKey:@"releaseVelocity"];
        [coder encodeFloat:duration forKey:@"duration"];
    }
    

    你的initWithCoder: 看起来像:

    - (id)initWithCoder:(NSCoder *)decoder {
        if (self = [super init]) {
            self.noteIndex = [decoder decodeIntForKey:@"noteIndex"];
            // and so on
        }
        return self;
    }
    

    【讨论】:

    • 现在实例化对象时是否必须显式调用'initWithCode:(NSCoder*)decoder'?如果是这样,你会为“解码器”传递什么?
    • 没关系,我测试过,你不必显式调用它,谢谢!
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多