是否可以使用NSSecureCoding将UIView写入磁盘。下面的代码会导致错误。
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:YES error:&error];错误:无法写入数据,因为它的格式不正确。
我们还尝试了以下操作:
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:YES];
[archiver encodeObject:view forKey:@"view"];
[archiver finishEncoding];错误:此解码器将只解码采用NSSecureCoding的类。类“UIView”不采用它。
发布于 2021-06-15 07:04:48
除了NSCoding需求之外,NSSecureCoding还简单地要求类实现一个类函数+(BOOL)supportsSecureCoding。UIView已经支持NSCoding,看起来可能是一个疏忽,因为它还不符合NSSecureCoding;Xcode调试器会发出关于非NSSecureCoding序列化调用在遥远的将来会消失的警告。
您可以使用类别将类函数添加到UIView:
@interface UIView(SecureCoding)<NSSecureCoding>
@end
@implementation UIView(SecureCoding)
+ (BOOL)supportsSecureCoding {
return TRUE;
}
@end因此,正如评论中所指出的,这并不意味着您可以使用NSKeyedUnarchiver反序列化,因为UIViews似乎并不打算以这种方式序列化。我猜他们支持序列化的主要原因是为了xibs/nibs/故事板。下面是一个UIView序列化的示例,它确实有效,但使用的是私有API,因此它仅用于说明目的:
添加声明以访问未发布的API:
/* Warning: Unpublished APIs!*/
@interface UINibEncoder : NSCoder
- initForWritingWithMutableData:(NSMutableData*)data;
- (void)finishEncoding;
@end
@interface UINibDecoder : NSCoder
- initForReadingWithData:(NSData *)data error:(NSError **)err;
@end序列化/反序列化:
/* 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"];https://stackoverflow.com/questions/67776944
复制相似问题