- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用目前使用这个已弃用的函数:
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 的原因是什么?
请注意,我主要关心的是读取在弃用存档功能之前存储的现有数据。简单地更改为较新的功能并不能解决问题。
最佳答案
有趣的问题!我一直支持 iOS 10.0,所以在看到这个之前我没有遇到过这样的问题。我修修补补了一个小时,成功找到了问题。
What could be causing the IF statement to return FALSE using the newer code?
那是因为你的unarchivedObject
对象是 nil!
如果使用参数error
在新方法中,您会看到如下错误:
Error Domain=NSCocoaErrorDomain Code=4864 "This decoder will only decode classes that adopt NSSecureCoding. Class 'QTPerson' does not adopt it." UserInfo={NSDebugDescription=This decoder will only decode classes that adopt NSSecureCoding. Class 'QTPerson' does not adopt it.
但是我们如何得到这个 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
然后实现协议(protocol)方法:
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
,因此您要查找的是 TRUE/YES 值!
关于ios - 如何将 NSKeyedUnarchiver unarchiveObjectWithData 更新为 NSKeyedUnarchiver unarchivedObjectOfClass :[fromData:error:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58043107/
我的应用目前使用这个已弃用的函数: id unarchivedObject=[NSKeyedUnarchiver unarchiveObjectWithData:codedData]; if([una
我对这段代码有疑问,它在调试环境中运行。在仪器上,我发现此功能存在内存泄漏问题,仪器发出警告 类别 事件类型 时间戳 地址 大小 负责库 负责调用者27 社交网络 Malloc 00:19.951 0
我试图将一个对象存档到 plist 文件中,并稍后加载它以填充 tableView。看起来该文件已正确存档,但在尝试从文件中获取值时访问错误。 我做错了什么吗? 这是我保存它的地方 // Create
我无法得到之前(相关)问题的任何答复,所以我想知道稍微解释一下是否会有帮助。 我正在使用 NSKeyedArchiver 对一些复杂的对象进行编码并将其保存到磁盘。比如说 - Class member
我正在使用 NSKeyedUnarchiver unarchiveObjectWithFile: 读取应用程序数据。当在 Instruments 中使用 Leaks 运行时,我被告知以下情况会产生泄漏
我正在制作一个跟踪用户锻炼情况的应用程序。我有两个自定义类,第一个是 ExerciseModel,它保存锻炼期间执行的每个练习的数据,包括名称、组数、次数等。这是我的数据模型: import UIKi
我在 NSKeyedUnarchiver 中遇到了一个奇怪的行为。 我存档一个数据,对于这个例子我只使用一个字符串: NSMutableData *myData = [ NSMutable
我有一个关于 NSKeyedUnarchiver、NSMutableArray 和自创建类的问题。数据由 NSKeyedArchiver 存储为用户默认值。当数据加载到用户默认值时将被打印到数据流的控
我简化了提问的代码。 我想保存更多类并加载类模型文件。 但现在我将参数简化为模型 (FlightSettingModel.h) 中的一部分 (lim)。 在 FlightSettingModel.h
我有一个表格 View 。我想向其中添加数据。我上网冲浪并找到了一些示例代码。然而,他们中的许多人正在使用 NSKeyedUnarchiver(编码、解码)。为什么我们需要这样做?有什么具体原因吗?
我的应用程序委托(delegate)因 NSException 崩溃而崩溃。在 NSUnarchiver 期间,我使用了异常断点工具来查明它崩溃的地方(在它上面添加了一条评论,在 init() 内),
swift 3, 我在我的 iOS 应用程序中使用 NSUserDefaults 来保存和加载 indexPath 以及操作发生在行的哪个部分。因为我的 TableView 中的每一行都有一个按钮。每
我有两个共享绘图 Canvas 的应用程序,我们称其中一个为“子级”,另一个为“父级”。 他们都对自己的绘图进行编码并将其上传到 Parse。当他们共享同一张图时,实际上是他们各自的图重叠在一起。 我
我遇到了一个奇怪的崩溃,大麦曾经发生过,我想知道这是否是由于读取了损坏的数据造成的?我发生了这个错误: -[NSKeyedUnarchiver initForReadingWithData:]: in
我想这很明显,但我对加载数据有疑问。如果有一个名为 library.dat 的文件,它存储有关应用程序中对象的所有类型的信息。它设置得很好(就 initWithCoder 和 encodeWithCo
我正在快速尝试 NSCoding 协议(protocol)的基本实现,但似乎我无法在正确归档对象后成功取消归档它。 这是我的尝试 import Cocoa class User: NSObject,
我有这个代码从文件加载一组属性,然后分配它。 NSMutableData* data = [NSData dataWithContentsOfFile:fullPath]; NSKeyedUnarch
我制作了一个在 iOS 项目中使用的自定义静态库。当我使用 NSKeyedUnarchiver 取消存档数据时。当我尝试在库中使用它时,它会引发异常。我尝试将静态库的类复制到我的项目中,看看这是否可行
在某些 AppDelegate 类中,我有属性 NSDictionary *dict; 在 applicationDidFinishLaunching 中,我加载它的方式如下: dict = (NSD
我有一个一起工作的归档程序和取消归档程序。 第二个程序的运行结果显示,虽然两个对象之一(myFoo1)很好地归档、存储和稍后取消归档,但另一个(myBook)似乎无法正确取消归档。我只是不知道归档和/
我是一名优秀的程序员,十分优秀!