iOS归档使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS归档使用相关的知识,希望对你有一定的参考价值。

参考技术A 在某种情况下,我们可能有这样的需求,需要将程序中用到的多个对象及其属性值,以及它们的相互对应关系保存到文件中,或者发送到另外的进程。为了实现这个功能, Foundation 框架中,可以把互相关联的多个对象归档为二进制文件,并且还可以将对象的关系从二进制文件内还原出来。像这样,将对象打包成二进制文件就称为归档。

将对象存储转换为二进制序列的过程称为归档、打包或编码,逆变换则称为解档或解码或对象还原。

Foundation 框架中的归档和系统架构是相互独立的。即PowerPC 和Intel都可以利用。在对象包含的实例变量值中,整数及实数这样的基本数据类型,以及指向其他对象的指针等都可以归档。普通指针虽然不能归档,但是根据指向的数据类型有时也可以归档的。

可以使用 NSKeyedArchiver 和 NSKeyedUnarchiver 完成对象的归档和解档操作,而它们都是抽象类 NSCoder 的子类。

所有可以归档的对象都必须要适用于 NSCoding 。协议 NSCoding 在 Foundation/NSObject.h 中定义,NSObject 自身并不采用该协议。 NSString 、 NSDictionary 等 Foundation 框架的主要类都适用协议 NSCoding 。

协议 NSCoding 按照如下方式声明。

协议 NSCoding 中,函数 encodeWithCoder 定义了归档自身的方法。参数coder是传人的实例, NSKeyedArchiver 的实例在 Foundation/NSKeyedArchiver.h 中。

如果超类适用于协议 NSCoding ,那么 super 将调用 encodeWithCoder 对超类的实例变量进行归档。如果超类像 NSObject 一样不适用于协议 NSCoding ,则不可调用。

为了从归档中还原对象,需要在各类定义初始化方法,即协议 NSCoding 的方法 initWithCoder 。参数对象为coder,实际上是继承于 NSCoder 的 NSKeyedArchiver 实例变量。这个对象被称解档器。 NSKeyedUnarchiver 的接口在 Foundation/NSKeyedArchiver.h 中定义。

只需在编码和解码中指定相同的键值,解码即可按照任意顺序还原对象,即使有不能还原的变量也无妨。

NSKeyedArchiver 的实例,即归档器。可将对象编码结果写入数据对象内。 NSKeyedArchiver 的初始化方法为:

归档器生成后,就可使用上面介绍的encode...方法进行数据归档。编码根对象后,对象图全体会被递归地进行归档。
所有归档完成后,最后必须调用 finishEncoding 方法进行后处理。

处理完成后,因归档器初始化传人的对象已经进行了归档。即可将其保存到文件中,或向其他进程发送消息。

解档器 NSKeyedUnarchiver 的初始化方法

还原归档的对象图和还原一个对象是同样的,都使用方法 decodeObjectForKey: 。

以上介绍了归档和解档实例生成方法,还有更简洁的方法也可将归档结果写入文件内,进行读取与还原。

无法使用 Xcode 7.2 归档带有 RestKit v0.10.3 的 iOS 5.0 时代项目

【中文标题】无法使用 Xcode 7.2 归档带有 RestKit v0.10.3 的 iOS 5.0 时代项目【英文标题】:Cannot archive an iOS 5.0 era project with RestKit v0.10.3 using Xcode 7.2 【发布时间】:2016-01-07 07:22:16 【问题描述】:

我有一个 iOS 5.0 时代的旧 iOS 项目。我需要使用最新的 iOS SDK 将其归档并提交到 App Store。

它由一个使用 RestKit 作为子子项目的.pbxproj 主项目组成。那个时代没有使用 Cocoapods 和RestKit is being included as git submodule。

在 Xcode 7.2 下,它构建和运行都非常好,但是在归档时,它一直提示如下错误消息:

#import <RestKit/RestKit.h> 失败

我已经搜索过 RestKit 的旧文档并尝试使用 the suggested method,但仍然不适合我。

不知道是不是Header Search Paths在构建设置里设置错了,原来是"$(BUILT_PRODUCTS_DIR)/../../Headers"

附:我不想升级 RestKit 版本。最低支持 iOS 版本应为 iOS 7。

【问题讨论】:

是的,您很可能需要更改发布标头路径 【参考方案1】:

请尝试使用 5.0 或更早版本的旧 Xcode 进行归档。由于 Xcode 7.2 不支持 5.

【讨论】:

我的机器上没有安装这么旧版本的 Xcode。 ***.com/questions/10335747/… 使用以上链接下载旧版本 它仍然没有解决我的问题,因为我需要使用最新的 SDK 编译和构建它并提交到 App Store。 好的,您使用的是支持 ios 8.0 或更高版本的最新 rest kit 版本吗?【参考方案2】:

我终于设法通过在Release 构建配置中设置所有xcodeprojs(沿着链,包括父和子)中的目标Header Search Paths 来解决我的问题。我已将值设置为"$BUILT_PRODUCTS_DIR/../../IntermediateBuildFilesPath/Headers"。我发现在归档阶段,RestKit 头文件被复制到IntermediateBuildFilesPath/Headers

【讨论】:

有人知道IntermediateBuildFilesPath是不是新加的吗?从哪个 Xcode 版本 IntermediateBuildFilesPath 被合并?

以上是关于iOS归档使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 GPUImage 归档 ios 应用程序时出现编译错误

iOS 归档的记录

Xcode 7 尝试使用库归档 ios 应用程序

iOS archive(归档)的总结

iOS---归档与解档

使用新资源/资产归档 iOS ipa