【问题标题】:IOS: store in NSUSerdefault an array of object [duplicate]IOS:在NSUserdefault中存储一个对象数组[重复]
【发布时间】:2013-06-06 14:07:57
【问题描述】:

我有一个对象数组(自定义对象),它被称为“收藏夹”,当我尝试将此数组存储在 NSUserDefault 中时出现此错误

我的代码:

inside favorite -> (object1, object2, object3...) from class MyObject

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData* myClassArrayData = [NSKeyedArchiver archivedDataWithRootObject:favorite];
    [defaults setObject:myClassArrayData forKey:@"favorite"];

我的错误:

[MyObject encodeWithCoder:]: unrecognized selector sent to instance

为什么?

【问题讨论】:

标签: ios objective-c object nsuserdefaults


【解决方案1】:

要存储自定义对象,在您的情况下为MyObject,该类必须实现NSCoder 接口。

接口只有两个方法:

- (id) initWithCoder:(NSCoder *)aDecoder {
    self = [super init];

    if (self) {

        self.identifier = [aDecoder decodeIntegerForKey:@"identifier"];
        self.name = [aDecoder decodeObjectForKey:@"name"];
        /* continue with all the properties that need to be restored  */

    }

    return self;
}

- (void) encodeWithCoder:(NSCoder *)aCoder {
     [aCoder encodeInteger:self.identifier forKey:@"identifier"];
     [aCoder encodeObject:self.name forKey:@"name"];
     /* continue with all the properties that need to be saved  */
}

【讨论】:

  • 这是一个编译问题。它不会导致在运行时将无法识别的选择器发送到实例错误
  • 在错误中指出MyObject 无法识别encodeWithCoder:,这是您需要实现的两种方法之一,以使您的类符合NSCoder 接口。跨度>
  • 是的,您需要提供方法。你是否指定你的对象符合协议只在编译时很重要。
  • 是的,但错误清楚地表明 MyObject 类没有。因此,favorite 变量要么是 MyObject 类型,要么它包含它正在尝试编码的 MyObject 类型的属性。无论哪种方式,MyObject 类都不符合NSCoder 接口。
  • 是的,它对我来说工作正常。首先,我在 viewcontroller 中错误地实现了这两种方法。后来我意识到在 NSObject 类中实现。谢谢。
猜你喜欢
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2021-10-15
相关资源
最近更新 更多