首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSSecureCoding:将UIView写入磁盘

NSSecureCoding:将UIView写入磁盘
EN

Stack Overflow用户
提问于 2021-05-31 23:54:12
回答 1查看 78关注 0票数 1

是否可以使用NSSecureCoding将UIView写入磁盘。下面的代码会导致错误。

代码语言:javascript
复制
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:YES error:&error];

错误:无法写入数据,因为它的格式不正确。

我们还尝试了以下操作:

代码语言:javascript
复制
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver  *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:YES];
[archiver encodeObject:view forKey:@"view"];
[archiver finishEncoding];

错误:此解码器将只解码采用NSSecureCoding的类。类“UIView”不采用它。

EN

回答 1

Stack Overflow用户

发布于 2021-06-15 07:04:48

除了NSCoding需求之外,NSSecureCoding还简单地要求类实现一个类函数+(BOOL)supportsSecureCoding。UIView已经支持NSCoding,看起来可能是一个疏忽,因为它还不符合NSSecureCoding;Xcode调试器会发出关于非NSSecureCoding序列化调用在遥远的将来会消失的警告。

您可以使用类别将类函数添加到UIView:

代码语言:javascript
复制
@interface UIView(SecureCoding)<NSSecureCoding>
@end

@implementation UIView(SecureCoding)
+ (BOOL)supportsSecureCoding {
    return TRUE;
}
@end

因此,正如评论中所指出的,这并不意味着您可以使用NSKeyedUnarchiver反序列化,因为UIViews似乎并不打算以这种方式序列化。我猜他们支持序列化的主要原因是为了xibs/nibs/故事板。下面是一个UIView序列化的示例,它确实有效,但使用的是私有API,因此它仅用于说明目的:

添加声明以访问未发布的API:

代码语言:javascript
复制
/* Warning: Unpublished APIs!*/
@interface UINibEncoder : NSCoder
- initForWritingWithMutableData:(NSMutableData*)data;
- (void)finishEncoding;
@end

@interface UINibDecoder : NSCoder
- initForReadingWithData:(NSData *)data error:(NSError **)err;
@end

序列化/反序列化:

代码语言:javascript
复制
/* This does NOT work */
NSKeyedArchiver  *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:NO];
[archiver encodeObject:object forKey:@"view"];
[archiver finishEncoding];
data = [archiver encodedData];


NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
/* error: 'UIBackgroundColor' was of unexpected class 'UIColor' */
data = [unarchiver decodeObjectForKey:@"view"];


/* This DOES work, but don't use it in an app you plan to publish */
NSMutableData *mData = [NSMutableData new];
UINibEncoder *encoder = [[UINibEncoder alloc] initForWritingWithMutableData:mData];

[encoder encodeObject:object forKey:@"view"];
[encoder finishEncoding];

UINibDecoder *decoder = [[UINibDecoder alloc] initForReadingWithData:mData error:&error];
NSObject *myView = [decoder decodeObjectForKey:@"view"];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67776944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档