【问题标题】:How can you encode and decode Class type object in objective C?如何在目标 C 中编码和解码 Class 类型的对象?
【发布时间】:2017-11-01 13:37:23
【问题描述】:

我有这个对象:

@interface EasySortDevices : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *iconName;
@property (nonatomic) Class deviceObject;

@end

如何对 Class 属性 deviceObject 进行编码和解码?

PS:不适用于:

- (void)encodeWithCoder:(NSCoder *)aCoder {

     [aCoder encodeObject:self.name forKey:@"name"];
     [aCoder encodeObject:self.iconName forKey:@"iconName"];
     [aCoder encodeObject:self.deviceObject forKey:@"deviceObject"];
}

【问题讨论】:

  • “它不起作用”不是一个有用的陈述。如果它究竟是什么方式不起作用?您是否收到编译器警告或错误?运行时错误或崩溃?它只是没有按预期运行吗? Edit您的问题清楚地解释您的实际问题并包括所有相关细节。
  • 您可以使用NSStringFromClass(...)NSClassFromString(...) 将其转换为可(en/de)编码的字符串并返回

标签: ios objective-c decode encode nscoder


【解决方案1】:

deviceObject 应该支持 NSCoding。因此,要对自定义对象进行编码,您必须为其提供编码和解码方法。
附言 你写的encode方法不错,只需要那个deviceObject也能实现encode和decode。

【讨论】:

    【解决方案2】:

    限制编码器支持

    关注这个苹果链接:- https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html

    在某些情况下,一个类可以实现 NSCoding 协议,但不支持一种或多种编码器类型。例如,NSDistantObject、NSInvocation、NSPort 等类及其子类采用 NSCoding 仅供分布式对象系统内的 NSPortCoder 使用;它们不能被编码到档案中。在这些情况下,一个类可以测试编码器是否属于特定类型,如果不支持则引发异常。如果限制只是将一个类限制为顺序或键控归档,则可以将消息allowKeyedCoding 发送给编码器;否则,您可以测试编码器的类标识。

    或者,如果您将对象编码和解码与 NSSecureCoding 协议

    一起使用

    NSCoding 是一种在 iOS 或 Mac OS 上存储数据的非常简单和方便的方法,它可以将模型对象直接转换为文件,然后再次将其加载回内存,而无需编写任何文件解析和序列化逻辑。要将任何对象保存到数据文件(假设它实现了 NSCoding 协议),您可以这样做:

    Class * deviceObject = [[Class alloc] init];
    [NSKeyedArchiver archiveRootObject:deviceObject toFile:deviceObject];
    

    稍后再加载:

    Class *deviceObject = [NSKeyedUnarchiver unarchiveObjectWithFile:deviceObject];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      相关资源
      最近更新 更多