如何将 NSSecureCoding 与 id 对象一起使用

2024-06-19

我正在创建一个链接列表并使用容器对对象、下一个和上一个属性进行分组。就像基金会收藏一样,我希望它能够实现NSSecureCoding。这是声明:

@interface ListContainer : NSObject <NSCopying, NSSecureCoding>

@property (readonly, nonatomic) id object;
@property (nonatomic) ListContainer * next;
@property (nonatomic) ListContainer * previous;

@end

当实施- initWithCoder:方法让我震惊,我不知道该对象使用什么类:

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];

    if (self) {

        _object = [aDecoder decodeObjectOfClass:<#(__unsafe_unretained Class)#> forKey:@"object"];

        BOOL nextIsNil = [aDecoder decodeBoolForKey:@"nextIsNil"];

        if (!nextIsNil) {

            // Decode next
            _next = [aDecoder decodeObjectOfClass:[ListContainer class] forKey:@"next"];

            if (_next == nil) {
                return nil;
            }

            // Link the nodes manually to prevent infinite recursion
            self.next.previous = self;
        }
    }

    return self;
}

我应该使用-decodeObjectForKey:反而?它仍然是安全编码吗?


我最终将同样的问题发布到 Cocoa 的邮件列表中,最有趣的讨论发生了。一些亮点:

[...] 制作一个包含普通内容的 NSArray,例如 NSString、NSNumber、encode 使用decodeObjectForClasses 对其进行解码,不带任何类。你会 阵列失败。将 NSArray 添加到允许的类列表中并 .. 有用。所以,你认为 NSArray 会盲目地解码任何东西,所以 它不再安全。

添加自定义类的对象 在数组中实施安全编码,它将开始失败 再次。 NSArray 和其他集合类型允许以下元素 已知的安全系统类型,例如 NSString,但在任何外部都会失败 那。 [...]

此时我明白 NSArray 的行为并不符合我的预期。安全编码似乎不再那么安全了:

这似乎远非理想 [...]事实上,它解码了一组 已知实现 NSSecureCoding 的类是错误的,IMO,对于两个 原因 [...]

1)所包含的类实现 NSSecureCoding 的事实做 并不意味着我在期待它. [...]

2)它限制了可以存储的类。 [...]

在替代攻击中获得我没有预料到的课程尤其可怕。但显然 Cocoa 的承诺是不同的:

[...]如果你直接使用 NSArray() 或其他集合类 你的编码,你需要检查你返回的内容。他们是 “安全地”解码到苹果认为解码的程度 不会导致缓冲区溢出等,这就是你所经历的一切 默认. [...]

So, no, NSSecureCoding不保证容器的安全编码,或者至少不保证类型检查,您必须自己进行。甚至在 Cocoa 的本机数据结构中也没有,正如我最初假设的那样(我仍然认为这是有原因的)。

罗兰·金的所有努力都归功于道具。你可以看到完整的对话here http://lists.apple.com/archives/cocoa-dev/2015/Jul/msg00244.html.

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

如何将 NSSecureCoding 与 id 对象一起使用 的相关文章

  • 表格列上的复选框不会记录点击

    我有一个表视图 可以动态添加列 必须以这种方式完成 因为我无法预测需要多少列或哪些列 有些列是复选框 https stackoverflow com questions 2134478 problem naming nstablecolum
  • 将 NSAlert 设为最顶层窗口?

    我在应用程序中创建了主窗口以进行以下设置 self setLevel kCGDesktopWindowLevel 1 self setCollectionBehavior NSWindowCollectionBehaviorCanJoinA
  • GPUImage 动画高斯模糊滤镜

    我使用 GPUImage 高斯模糊滤镜来模糊静态图像 我想将模糊大小与 UI 元素联系起来 当用户更改该元素时 我会模糊图片 我现在的做法是 当发生重大 gt 0 25 变化时 更改blurSize 重新应用滤镜并将新图像动画化到image
  • 在 iPhone 5s 或 64 位模拟器上测试 32 位 iOS 应用程序

    我有一个使用第三方库的应用程序 64 位版本的库存在错误 因此我不得不恢复到 32 位版本的框架 我想在 5s 上测试这个版本 但从 XCode 中 它将尝试在 64 位中构建 并且由于这个 32 位框架 构建将失败 我需要发布一个版本 但
  • 将 NSDate 转换为 NSString

    我如何转换 NSDate to NSString所以只有这一年 yyyy 格式是输出到字符串吗 怎么样 NSDateFormatter formatter NSDateFormatter alloc init formatter setDa
  • UIWebView 中的后退/前进滑动手势?

    我的应用程序中有一个 WebView 因为它是一个选项卡式应用程序 所以我无法在网站上添加用于后退 前进的按钮 我想通过滑动来后退 前进 从左侧 边缘向右滑动又回来了 就像 iOS 版 Safari 浏览器一样 我该怎么做 我想我应该使用
  • 将属性字符串中的正则表达式匹配替换为 Objective-C 中的图像

    我的目标是在 Parse com 中存储属性字符串的信息 我决定为我的图像提出一种属性文本编码 通过替换任何字符串来工作 X 与相应的图像放在大括号中 例如 Picture of 2 colorless mana X 应该产生一个属性字符串
  • 创建 DOMElement Objective C 的位图

    我有一个 Webkit DOMElement 例如一个 div 现在我想要它的渲染 NSImage 或 NSBitmapImageRep 它就像 DOMElement 的屏幕截图 公共 API 选择 NSView cacheDisplayI
  • 是否可以在 UITabBarController 内显示 SFSafariViewController?

    我要加载SFSafariViewController位于选项卡内部 因此选项卡栏位于整个 Safari 视图的底部 这可能吗 我尝试了这个但没有运气 self tabBarController presentViewController s
  • 来自 NSString 的 iOS SecKeyRef

    我需要使用公钥将用户密码加密为 Base64 字符串 公钥是一个 NSString 像这样的东西 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgWO7p1AvCaHUeaM6rSczBBAqt mKObHx
  • 核心数据是否始终将返回对象视为错误?

    在下面的代码中 我显式地将 returnObjectsasFaults 设置为 false 然后在请求之后我立即检查对象是否有故障 NSAssert 失败 也许是因为该对象是 imageBlob 也许我错过了什么 我只是想确定一下 这是一个
  • 带有嵌套数组的 NSPredicate

    我有以下对象结构 类别 子类别 子类别的 nsarray 子类别 问题 问题的 nsarray 问题 问题 nsstring 答案 ns字符串 我需要的是用给定的子字符串搜索任何问题 以下谓词不起作用 NSPredicate predica
  • Objective C:在 gdb 中哪里可以找到

    我正在尝试使用 NSZombie 调试我的程序 调试器确实返回了存在问题的实例的地址 但是我不确定在哪里获取运行命令 shell malloc history 所需的 pid 谁能告诉我在这种情况下使用的正确 pid 是什么 我尝试了 32
  • 如何消除错误 服务无效 请检查您的设置并尝试

    我一直在努力工作 一切都很顺利 只是突然间 当我尝试构建我的项目时 我在 xCode 中收到以下错误 1 在构建时的警报框中 服务无效 请检查您的设置并重试 0xE8000022 只需重新启动您的 iPod 或 iPhone 即可
  • iOS 64 位 @try {... } @catch {...} 不起作用

    我有一个非常特殊的问题 最近 我向我的 iOS 项目 arm64 添加了 64 位支持 从那时起 我开始收到内部代码段未捕获的异常 try catch 我使用 Crashlytics 进行崩溃报告 我设法在应用程序中的任何位置使用以下代码行
  • ios - navigationItem.titleView 更新时闪烁

    我有一个UIView 拿着一个UIButton 设置为我的navigationItem titleView 当我更新此按钮的文本时 它会短暂闪烁 消失并随新文本重新出现 无论如何 当它改变时 是否可以保持它可见 那么 如果我更改 2015
  • iOS 应用程序和.NET 应用程序之间的通信?

    我有 2 个应用程序 一个是 iOS 应用程序 一个是 NET 应用程序 我希望我的 iOS 应用程序发送一条消息 调用 NET 应用程序的方法 将一些字符串发送到 NET 应用程序以保存到数据库 那么 我的 iOS 应用程序如何与 NET
  • 如何制作字幕 UILabel / UITextField / NSTextField

    我需要制作字幕UILabel在 Xcode 中 选取框将从右向左滚动 我试过CCScrollingLabel also JHTickerView和别的 但我找不到带有选框的简单代码 没有任何视图 数组 一些愚蠢的库和其他库 如何制作选框UI
  • 如何在 UICollectionView PerformBatchUpdates 块中排序移动、插入、删除和更新?

    In my UICollectionView 我使用一个简单的自定义对象数组来生成和显示单元格 有时数据会发生变化 我想一次性为所有变化添加动画效果 我选择通过跟踪第二个数组中的所有更改 比较两个数组并在一个数组内生成一组移动 插入 删除和
  • Swift 和 Objective-C 框架公开其内部结构

    我正在尝试将 Swift 添加到具有公共 私有和项目文件的现有 Objective C 框架中 为了让 Swift 能够访问项目文件 我添加了一个定义新模块的模块映射 例如MyFramework Internal 通过包含所有项目标题 如下

随机推荐

  • 如何在 PHP 中使用 file_get_contents 获取图像的 MIME 类型

    我需要获取图像的 MIME 类型 但我只有图像的正文file get contents 是否有可能获取 MIME 类型 是的 你可以这样得到它 file info new finfo FILEINFO MIME TYPE mime type
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 在 IE10 中禁用捏合放大

    在 IE10 触摸模式下 我希望仅使页面的特定部分可缩放 其余的不应该 我找到了这个 http msdn microsoft com en US library ie hh772044 aspx http msdn microsoft co
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 使用 FIND 命令进行并集、交集和排除?

    我需要使用 find 命令管理列表 假设列表在非不同列表中具有随机名称 即它们的交集不是空集 我能怎么做 A B 查找列表A中除列表B中的文件之外的文件 A 路口 B 查找列表 A 和 B 共有的文件 请咨询here https stack
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • jQuery 检查复选框并触发 javascript onclick 事件

    我正在尝试使用 jQuery 检查复选框并在此过程中触发 onclick 事件 假设我在 html 中定义了一个复选框
  • eclipse - 在android虚拟设备中卡住中文

    当我在 Eclipse 中运行 Android 模拟器时 当我尝试编写文本时 所有键盘字符都会被翻译为中文 为什么是这样 Thanks 点击并按住EditText Select 输入法 Select 安卓键盘
  • 获取 SignalR hub 内的完整 URL

    我正在使用 SignalR 开发一个用户跟踪解决方案 作为学习 SignalR 的有趣项目 用于 ASP NET MVC 应用程序 目前我可以跟踪登录的用户以及他们在特定页面上停留的时间 如果他们移动到另一个页面 我也会跟踪该页面 并且 S
  • JFace/SWT:更改 InputDialog 中按钮的标签

    我想创建一个带有 确定 取消 按钮的自定义标签的输入对话框 我在用着org eclipse jface dialogs InputDialog http help eclipse org galileo index jsp topic or
  • javax.net.ssl.SSLException:没有可用的 PSK。无法恢复

    我正在使用 Jetty 客户端发送传出请求 在 Java 10 下完美运行的代码在 Java 11 下突然出现以下异常 javax net ssl SSLException No PSK available Unable to resume
  • UILocalNotification 在后台 10 分钟后不提示

    In didFinishLaunchingWithOptions调用函数的定时器循环httpRequest每 1 分钟间隔一次 BOOL application UIApplication application didFinishLaun
  • WIX 捆绑包创建

    我尝试创建一个包含 exe 的 MSI 使用 WIX 中的捆绑选项 这样做时出现错误 有人可以帮我解决这个问题吗 下面是代码
  • 每次重新运行终端时,我都必须输入 export PATH=~/anaconda/bin:"$PATH"

    我已经安装了 Anaconda for Mac 但出现了一些问题 当我输入命令时which conda or which ipython I get conda not found and ipython not find 然后我找到这个命
  • 改进 D3 序列旭日示例

    This D3示例作为我的出发点 http bl ocks org kerryrodden 7090426 http bl ocks org kerryrodden 7090426 我想更改提供图表的数据 并且我做了以下新示例 http j
  • 单击输入字段会触发窗口调整大小

    我有一个带有徽标 菜单和搜索的标题 当我在桌面上时 我会按该顺序显示所有元素 但如果我的窗口宽度小于 980 像素 菜单会隐藏 有一个切换按钮 并且徽标会与nav并附在徽标之后 如果宽度更大 则徽标将再次分离并附加到 DOM 中的旧位置 w
  • Jquery UI 日期选择器 设置默认日期

    我使用 jQuery UI 作为日期选择器 我想在字段中显示当前日期作为默认值 以下是我的代码 请帮助 From Date
  • 如何将 NSSecureCoding 与 id 对象一起使用

    我正在创建一个链接列表并使用容器对对象 下一个和上一个属性进行分组 就像基金会收藏一样 我希望它能够实现NSSecureCoding 这是声明 interface ListContainer NSObject