【问题标题】:Unarchive custom object with secure coding in iOS在 iOS 中使用安全编码取消归档自定义对象
【发布时间】:2021-01-15 15:23:05
【问题描述】:

我正在像这样成功地编码符合NSSecureCoding 的对象数组。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array requiringSecureCoding:YES error:nil];

如何取消归档这些数据?我正在尝试这样,但它返回 nil。

NSError *error = nil;
NSArray<MyClass *> *array = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:data error:&error];

这是它返回的错误。

无法读取数据,因为它的格式不正确。

【问题讨论】:

  • MyClass 是否向 NSSecureCoding 确认?
  • 是的,否则 -archivedDataWithRootObject 将无法工作。

标签: ios objective-c nskeyedarchiver nskeyedunarchiver nssecurecoding


【解决方案1】:

这是一个简单的例子

@interface Secure:NSObject<NSSecureCoding> {
    NSString* name;
}
@property NSString* name;
@end

@implementation Secure
@synthesize name;

// Confirms to NSSecureCoding
+ (BOOL)supportsSecureCoding {
    return true;
}

- (void)encodeWithCoder:(nonnull NSCoder *)coder {
    [coder encodeObject:self.name forKey: @"name"];
}

- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
    self = [self init];
    if (self){
        self.name = [coder decodeObjectOfClass:[NSString class] forKey:@"name"];
    }
    return  self;
}

@end

用法

Secure *archive = [[Secure alloc] init];
    archive.name = @"ARC";
NSArray* array = @[archive];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array requiringSecureCoding:YES error:nil];
NSArray<Secure *> *unarchive = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData:data error:nil];
NSLog(@"%@", unarchive.firstObject.name);

【讨论】:

  • 为什么是unarchivedObjectOfClass:[NSObject class]?
  • 有谁知道为什么这需要[NSObject class] 才能工作?我尝试了其他方法,例如 [MyClass class],但它仅适用于 NSObject 作为类类型。
猜你喜欢
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
相关资源
最近更新 更多