如何将 NSKeyedUnarchiver unarchiveObjectWithData 更新为 NSKeyedUnarchiver unarchivedObjectOfClass:[fromData:error:

2024-01-03

我的应用程序当前使用这个已弃用的函数:

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,所以在看到这个之前我还没有遇到过这样的问题。我折腾了一个小时,成功找到了问题所在。

使用较新的版本可能导致 IF 语句返回 FALSE 的原因 代码?

这是因为你的unarchivedObject对象是nil!

如果您使用参数error在新方法中,您会看到如下错误:

错误域 = NSCocoaErrorDomain 代码 = 4864 “此解码器只会 解码采用 NSSecureCoding 的类。 'QTPerson' 类没有 采用它。" UserInfo={NSDebugDescription=此解码器只会解码 采用 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,因此是您正在寻找的 TRUE/YES 值!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 NSKeyedUnarchiver unarchiveObjectWithData 更新为 NSKeyedUnarchiver unarchivedObjectOfClass:[fromData:error: 的相关文章

  • 当您感兴趣的任务完成时,是什么让完成处理程序执行该块?

    我一直在询问并试图了解完成处理程序是如何工作的 我用过很多 也读过很多教程 我将在这里发布我使用的代码 但我希望能够创建自己的代码 而无需使用其他人的代码作为参考 我理解这个完成处理程序 其中调用者方法 void viewDidLoad n
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self
  • CALayer 抗锯齿不如 UIView 抗锯齿

    我一直在尝试使用 CALayer 制作圆形绘图的动画 一切都运行良好 但问题是 绘制的圆不够抗锯齿 它的边界有点太粗糙 或者如果使用光栅化则模糊 抗锯齿已启用 还尝试过 边缘抗锯齿遮罩 kCALayerLeftEdge kCALayerRi
  • 在ScreenUpdates之后调用drawViewHierarchyInRect时iOS8缩放故障:YES

    我正在将一个项目从 iOS7 转换为 iOS8 该项目使用自定义转换 并且需要在加载完成后捕获模式afterScreenUpdates YES并看到整个屏幕放大一秒钟然后缩小 我还在 iOS 版 Flickr 应用程序的各个部分之间以及在
  • 如何从通讯录 ios 以编程方式编辑电话号码值

    我正在尝试在 iOS 中以编程方式替换特定联系人的特定电话号码 获取联系人表单地址簿 我不知道为什么我无法保存新的电话号码并刷新地址簿以显示更改 我正在这样做 BOOL changeContactPhoneNumber NSString p
  • Objective-C 中 typedef 枚举语句在哪里?

    我担心的一个基本问题 以下代码有效 并且 typedef 枚举被识别 但我收到一条警告消息 空声明中无用的存储类说明符 我在这里做错了什么吗 这是放置 typedef 枚举的最佳位置吗 import
  • 使用GCD实现并发读独占写模型

    我试图了解使用 Grand Central Dispatch GCD 实现控制资源访问的并发读独占写模型的正确方法 假设有一个 NSMutableDictionary 被大量读取并且偶尔更新 确保读取始终与字典状态一致的正确方法是什么 当然
  • iOS崩溃核心位置CFBasicHashCreateCopy?

    我已经通过 Crashlytics 报告了这个问题 尽管我无法在本地复制它 所以除了下面的堆栈跟踪之外我没有什么可做的 不确定堆栈跟踪中是否引用了 CoreLocation与它有任何关系 但我不确定可能是什么原因 我的项目使用的是ARC 有
  • CoreBluetooth:如何为许多特性(30 - 40)设计代码?

    我搜索了一下 发现这是一个可能重复的问题 同一设备的多个 CBPeripheral https stackoverflow com questions 10836703 multiple cbperipherals for same dev
  • 有没有办法检测 iOS 设备进入睡眠模式(屏幕变黑时)时的事件?

    我想检测两个事件 设备被锁定 解锁 设备进入睡眠状态并且屏幕变黑 我在这里实现的第一个目标是 有没有办法检查 iOS 设备是否锁定 解锁 https stackoverflow com questions 14229955 is there
  • 斯威夫特/iOS。从导航堆栈中删除一些视图控制器

    这是我想做的 但我不确定这是否是正确的方法 所以请给我建议如何去做 我有初始 VC 和导航 VC 我从中推送第一个 VC 从中推送第二个 VC 接下来我介绍 来自第二个 VC 的 NavigationController 第三个 VC 现在
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • iOS 11 浏览器图像错误

    在 iOS 11 中滚动页面时出现以下错误 在 Firefox Safari 和 Chrome 中 在 Android 设备中 不会发生该错误 这些是背景图像 我不知道这是否是导致错误的原因 图 2 显示了图像在 Android 中的用途和
  • ios 如何存储用户输入的详细信息并取回?

    How to Store用户输入的详细信息和Get it Back在ios中 我有以下关注TextFields UserName Email Re enter Email id Phone State Address Localityand
  • 每次 UIScrollView 释放时都会发生内存泄漏

    在我的应用程序中 我有一个滚动视图和四个表格视图 每次拖动然后释放时 我都会泄漏 48 字节 这确实很重要 正如您所看到的 两组泄漏都有相同的来源 有人见过这样的泄漏吗 Edit 1 当我单击泄漏旁边的箭头时 我会得到泄漏的以下信息 您所看
  • 使用 Objective C 将 RGB 彩色图像更改为灰度图像

    我正在开发一个将彩色图像更改为灰度图像的应用程序 然而 有些图片显示出来是错误的 我不知道代码有什么问题 也许我输入的参数有误 请帮忙 UIImage c UIImage imageNamed downRed png CGImageRef
  • 如何使用libxml解析来解析xml数据

    这是一个我想使用libxml解析来解析的xml结构 我如何获取 campaign 标签的属性值 即ID对于 图像 标签 即url and size 如果我使用这些值 我可以提取 code 标签和 name 标签的值 static const
  • 如何按字母顺序对 NSMutable 数组中的自定义对象字段进行排序?

    我有一个自定义对象 例如 import

随机推荐

  • “所选目录不是 JDK 的有效主目录”Android Studio

    我一直在使用安卓工作室直到我更新到0 2 6 现在 我无法编译或创建新项目 会发生什么 我不确定 但我认为安卓工作室不知道我的 sdk 文件夹在哪里 我的意思是我的 android studio 目录中的 sdk 文件夹 我做了什么 我已经
  • Matplotlib vline 标签参数未显示

    我想用 matplotlib 的 vline 命令标记垂直线 但由于某种原因 label 参数在最终绘图上不执行任何操作 显示任何内容 有谁知道如何让标签显示出来 plt vlines x pah ymin 0 ymax 0 6 color
  • graphviz - 比较图形树

    我必须用 graphviz 来做一份工作 我需要可视化几棵树的图形表示 但无论如何我都必须比较两棵树以查看它们的差异 像这样 我有树 A 和树 B 创建它们的表示并比较它们后 我只需要查看没有共同点的节点 有人告诉我使用 EMF Compa
  • 如何在 TFS 构建定义中获取签入评论/消息?

    是否可以在 TFS 2013 构建定义 工作流程文件 中获取签入注释 消息 我看过BuildDetail但还没找到 注释是 a 的属性 a变更集 http msdn microsoft com en us library microsoft
  • 当锚标记仅触发 jQuery 操作而不重定向用户时,可以替代

    我的页面上有许多锚标记 它们仅触发同一页面上的 jQuery 操作 不会将用户重定向到另一个位置 这是锚标记的正常预期行为 我不想在我的应用程序中为每个操作都提供静态 URL 但是 我也不喜欢每次用户单击其中一个时都将其发送到页面顶部 a
  • 如何使椭圆跟随画布上的曲线

    我在尝试让椭圆正确遵循画布上的路径时遇到问题 我认为问题源于这样一个事实 我的迷你语法定义了 x 和 y 值之间的移动 但仅针对目标属性中的这些值之一 例如 Canvas Top or Canvas Left 我似乎在画布上找不到任何附加的
  • 我可以自动保存正在运行的 jupyter python 笔记本而不在浏览器选项卡中打开它吗?

    所以我有一个长期运行的Python笔记本 只要在我的浏览器选项卡中打开它 它就会每 2 分钟自动保存一次 生活很美好 即使我关闭浏览器选项卡 是否可以保持自动保存 当我关闭选项卡时 内核已经继续运行 这很棒 这有点像 屏幕 但是在 jupy
  • 模板参数上的 C++ 函数模板重载

    是否可以像这样重载函数模板 仅在使用enable if的模板参数上 template
  • Gradle:强制自定义任务始终运行(无缓存)

    我编写了一个自定义 Gradle 任务来处理路径可配置的文件系统上的一些依赖项解析 我希望这种类型的任务始终运行 我猜它们似乎只运行一次 因为输入似乎永远不会改变 我知道使用configurations resolutionStrategy
  • 没有声明为 public、private 或 protected 的变量是什么?

    如果代替 private JButton theButton 我这样定义一个字段 JButton theButton 有什么不同 Package
  • 如何通过推送通知打开 ios 应用程序?

    我可以知道如何打开 ios 应用程序 点击通知 或者当我们滑动通知图标时 如果 iPhone 被锁定 有人可以帮我吗 当点击通知时 操作系统会处理该行为 无论通知是否由第 3 方发送 如果它通过 APNS 它将打开应用程序并在内部appli
  • 如何在Linux中截图(高fps)(编程)

    首先我想说我已经阅读了很多关于这方面的内容并且学到了很多方法来做到这一点 但是我还没有能够在linux中做到这一点 我的项目是一个带有arduino的流光溢彩的项目 所以我需要截取桌面的屏幕截图并分析它的颜色 一开始 我使用Processi
  • 为 64 位 LCG 找到更多独立的种子值(MMIX(由 Knuth))

    I m using a 64 bit LCG MMIX by Knuth It generate a certain block of random numbers inside my code which use them to perf
  • Entity Framework Core - 延迟加载

    根据我的 Visual Studios 请求 我使用 Entity Framework Core 1 0 1 开始了我的最新项目 因此 编写我的数据库模型时 我总是使用 虚拟 说明符来启用列表的延迟加载 尽管在加载父表时 子列表似 乎从未加
  • 使用 golang 对每个请求实现上下文超时

    我正在尝试处理每个请求的上下文超时 我们有以下服务器结构 流程概述 去服务器 基本上 充当 反向代理 2 https en wikipedia org wiki Reverse proxy 认证服务器 检查请求身份验证 应用服务器 核心请求
  • 如何覆盖 FosUser 注册表单布局的布局。

    如何覆盖注册表的布局 目前的形式是 username email password verification 我想要覆盖此表单的布局 比如说 每行两个问题 username email additional text password ve
  • 使用 Q 打破动态的 Promise 序列

    我有几个承诺 P1 P2 Pn 我想将它们按顺序链接起来 所以 Q all 不是一个选项 并且我想在第一个错误时打破链条 每个承诺都有其自己的参数 我想拦截每个承诺错误以转储错误 如果 P1 P2 PN 是我的承诺 我不知道如何自动化该序列
  • 有什么方法可以让任务在 django 的服务器端运行吗?

    基本上 我的 django web 应用程序中有一个机器人 当给定您的社交媒体凭据时 它会管理您的社交媒体帐户之一 我能够在客户端仍在网站上时成功运行它 并且正如您所期望的那样 当客户端关闭网站时它会停止 有没有什么方法可以存储凭据 然后在
  • R 代码根据列的值插入行并将其增加 1

    我的数据中有两列 如下所示 我想根据总计列中的值插入行 例如 对于 record1 总计值为 9 因此 代码 XS1 1 应该有 9 条记录 总计从 1 到 9 为了更清楚起见 请在下面找到预期输出 我刚刚学习 R 的基础知识 您能帮我编写
  • 如何将 NSKeyedUnarchiver unarchiveObjectWithData 更新为 NSKeyedUnarchiver unarchivedObjectOfClass:[fromData:error:

    我的应用程序当前使用这个已弃用的函数 id unarchivedObject NSKeyedUnarchiver unarchiveObjectWithData codedData if unarchivedObject isKindOfC