我的应用程序目前使用的是这个不推荐的函数:
id unarchivedObject=[NSKeyedUnarchiver unarchiveObjectWithData:codedData];
if([unarchivedObject isKindOfClass:[NSDictionary class]]){
// currently returns TRUE when reading existing user data.
} 为了更新,我已经转换成以下内容:
id unarchivedObject=[NSKeyedUnarchiver unarchivedObjectOfClass:[NSDictionary class] fromData:codedData error:nil];
if([unarchivedObject isKindOfClass:[NSDictionary class]]){
// currently returns FALSE when reading existing user data.
}数据最初是这样编码的:
-(void)encodeWithCoder:(NSCoder*)encoder{
[encoder encodeObject:text forKey:@"text"];
}
-(instancetype)initWithCoder:(NSCoder*)decoder{
if(self=[super init]){
text=[decoder decodeObjectForKey:@"text"];
}是什么原因导致IF语句使用更新的代码返回FALSE?
请注意,我主要关心的是阅读现有的数据之前存储的建议存档功能。简单地切换到较新的函数并不能解决问题。
发布于 2019-09-21 20:25:03
有趣的问题!我一直支持iOS 10.0,所以直到我看到这一点,我才遇到这样的问题。我修补了一个小时,成功地发现了这个问题。
,什么会导致IF语句使用更新的代码返回FALSE?
这是因为您的unarchivedObject对象是0!
如果在新方法中使用参数error,则会看到如下错误:
Error Domain=NSCocoaErrorDomain Code=4864“此解码器只对采用NSSecureCoding的类进行解码,类'QTPerson‘不采用。”UserInfo={NSDebugDescription=This解码器只对采用NSSecureCoding的类进行解码。类'QTPerson‘不采用它。
但是,我们如何得到这个unarchivedObject的正确值而不是零呢?需要几步之遥。
首先,使您的模型/类符合<NSCoding, NSSecureCoding>
示例:QTPerson.h
#import <Foundation/Foundation.h>
@class QTPerson;
NS_ASSUME_NONNULL_BEGIN
#pragma mark - Object interfaces
@interface QTPerson : NSObject <NSCoding, NSSecureCoding>
@property (nonatomic, copy) NSString *text;
@end
NS_ASSUME_NONNULL_END然后实现协议方法:
QTPerson.m
#import "QTPerson.h"
@implementation QTPerson
+ (BOOL)supportsSecureCoding {
return YES;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:_text forKey:@"text"];
}
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
_text = [coder decodeObjectOfClass:[NSString class] forKey:@"text"];
}
return self;
}
@end然后,在归档对象时,需要将YES传递给参数requiringSecureCoding,如下所示:
QTPerson *person = [[QTPerson alloc] init];
person.text = @"Glenn";
NSData *codedData1 = [NSKeyedArchiver archivedDataWithRootObject:person requiringSecureCoding:YES error:nil];
[[NSUserDefaults standardUserDefaults] setValue:codedData1 forKey:@"boom"];最后,在未存档时,只需做正确的操作,如下所示:
NSData *codedData = [[NSUserDefaults standardUserDefaults] dataForKey:@"boom"];
NSError *er;
id unarchivedObject=[NSKeyedUnarchiver unarchivedObjectOfClass:[QTPerson class] fromData:codedData error:&er];
if([unarchivedObject isKindOfClass:[QTPerson class]]){
NSLog(@"TRUE!");
} else {
NSLog(@"FALSE!");
}瞧!您将得到非空对象unarchivedObject,因此您要寻找的是真正的/是的值!
https://stackoverflow.com/questions/58043107
复制相似问题