首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

检索自定义类时返回nil的NSKeyedUnarchiver

NSKeyedUnarchiver是苹果公司提供的一个用于反序列化(解档)数据的类,它可以将归档(序列化)的数据还原为原始的对象。当我们使用NSKeyedUnarchiver进行反序列化时,有时会遇到检索自定义类时返回nil的情况。

这种情况通常是由于以下几个原因导致的:

  1. 类未正确实现NSCoding协议:在使用NSKeyedUnarchiver进行反序列化时,被解档的类需要正确实现NSCoding协议。NSCoding协议要求类实现encode(with aCoder:)方法和init(coder aDecoder:)方法,分别用于归档和解档对象的属性。如果类没有正确实现NSCoding协议,NSKeyedUnarchiver在检索该类时会返回nil。
  2. 类名或属性名发生变化:如果在归档对象时使用了某个类的旧版本,而在解档时使用了该类的新版本,或者类的属性名发生了变化,NSKeyedUnarchiver也会返回nil。这是因为NSKeyedUnarchiver根据类名和属性名来检索对象,如果发生了变化,就无法正确检索到对象。
  3. 类的定义发生变化:如果在归档对象时使用了某个类的旧版本,而在解档时使用了该类的新版本,但是类的定义发生了变化(例如新增或删除了属性),NSKeyedUnarchiver也会返回nil。这是因为NSKeyedUnarchiver需要根据类的定义来还原对象,如果类的定义发生了变化,就无法正确还原对象。

针对这种情况,我们可以采取以下措施来解决问题:

  1. 确保自定义类正确实现NSCoding协议:在自定义类中,实现encode(with aCoder:)方法和init(coder aDecoder:)方法,确保所有需要归档和解档的属性都被正确编码和解码。
  2. 使用正确的类名和属性名:在归档和解档时,确保使用的是相同的类名和属性名。如果类名或属性名发生了变化,可以通过指定新的类名或属性名来进行映射,以便正确检索和还原对象。
  3. 处理类的版本变化:如果类的定义发生了变化,可以通过实现NSKeyedUnarchiverDelegate协议中的方法来处理版本变化。例如,在unarchiver(_:cannotDecodeObjectOfClassName:originalClasses:)方法中,可以根据旧的类名返回新的类名,以便NSKeyedUnarchiver能够正确检索和还原对象。

总结起来,当使用NSKeyedUnarchiver检索自定义类时返回nil时,我们需要检查类是否正确实现了NSCoding协议,是否使用了正确的类名和属性名,以及是否处理了类的版本变化。通过解决这些问题,我们可以成功地反序列化自定义类的对象。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent Cloud Metaverse):https://cloud.tencent.com/solution/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

「死磕」Core Data——非标准数据类型保存

NSFetchedResultsController使用 其实这个名字,会引起一定歧义,光看名字,以为是一个普通视图控制器,其实它并不继承自UIViewController。...这个,仅用于高效地管理从Core Data中取回数据,供UITableView使用,也就是作为UITableView数据源而存在。...当然,也可以选择Binary Data: 保存前,调用NSKeyedUnarchiverarchivedDataWithRootObject:方法返回NSData类型数据,让Core Data可以对其进行保存...; 取回,用NSKeyedUnarchiverunarchiveObjectWithData:方法,将取回NSData数据,转换回数组、字典对象。...自定义对象,也有两种思路: 直接定义成xcdatamodeld文件中一个实体,作为NSManagedObject子类,由CoreData直接保存; 如果不定义成实体,需要: 该自定义对象需要遵守

1K60
  • iOS数据持久化之二——归档与设计可存储化数据模型基

    试想,如果我们可以将用户登录返回信息模型,游戏中角色属性信息模型进行直接持久化存取,那是不是非常爽事,幸运是,我们可以通过归档,来设计一个这样数据模型。...其存储与读取过程,主要封装在两个中:NSKeyedArchiver和NSKeyedUnarchiver。...(3)进行自定义对象归档         上面介绍中有提到,原则上,任何遵守了NSCoding协议都可以进行归档操作,那么对于我们自定义对象,我们该如何来做呢?...三、设计可以归档存取数据模型基 1、动机与初衷         通过上面对归档介绍,我们可以发现归档一个十分有潜力应用:可以自由存取自定义数据对象。...    //Ivar:方法返回对象内容对象,这里将返回一个Ivar类型指针     //class_copyIvarList方法可以捕获到所有变量,将变量数量存在一个unsigned int

    1.1K30

    控制器和应用数据存储

    : //左上角返回按钮 @property(nonatomic, retain) UIBarButtonItem *backBarButtonItem; //中间标题视图 @property(...iTunes同步设备,不会备份该目录;    4)、Library/Caches 保存应用运行时生成非重要需要持久化数据,iTunes同步设备不会备份该目录;    5)、Library/Prefences...3)、使用NSKeyedArchiver对自定义对象进行归档, 使用NSKeyedUnarchiver解析归档对象       首先自定义需要实现NSCoding协议,然后实现方法      - (void...)encodeWithCoder:(NSCoder *)aCoder; //定义自定义哪些属性需要归档,如何归档      - (id)initWithCoder:(NSCoder *)aDecoder...; // 定义归档对象解析哪些属性需要解析,如何解析      如果父也遵守了NSCoding协议,应该在encodeWithCoder:方法中加上一句:[super encodeWithCode:

    80530

    检索COM工厂中CLSID为{00024500-0000-0000-C000-000000000046}组件失败

    具体解决方法如下: 1:在服务器上安装officeExcel软件; 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"; 3:依次双击"组件服务"->"计算机"->"我电脑"-...Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框; 5:点击"标识"标签,选择"下列用户"(用户名和密码写当前管理员)...; 6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应"编辑"按钮,在弹出"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"...本地启动"和"本地激活"权限; 7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"...权限.这样,我们便配置好了相应ExcelDCOM权限; 最后设置IIS应用程序池标识,把此网站AppPool标识要设置为NetworkService;

    1.3K70

    【IOS开发基础系列】数据持久化专题

    1 NSUserDefault NSUserDefaults简介,使用 NSUserDefaults 存储自定义对象 http://my.oschina.net/u/1245365/blog/294449...,只要在中实现每个属性都是基本数据类型(如int或float)或都是符合NSCoding协议某个实例,你就可以对你对象进行完整归档。...NSKeyedUnarchiver *archiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: theData]; //使用与归档编码使用相同键对象进行解码...SQLite支持常见数据类型, 如: 4.3 在iOS中使用SQLite3         为了能够在iOS中使用SQLite3需要是将libsqlite3.dylib库添加到Xcode工程中,在工程...= SQLITE_OK         sqlite3_exec是执行任何不带返回值sql语句,第2个参数是要执行sql语句,第3个参数是要回调函数,第4个参数是要回调函数参数,第5个参数是执行出错字符串

    27620

    iOS Keychain编程指南

    用户可以用一个密码来解锁Keychain,然后任何Keychain服务感知应用程序都可以使用该Keychain来存储和检索密码。...但是,对于所有这些项目类别,您使用相同一组函数来添加,修改和检索钥匙串项目: SecItemAdd 将项目添加到钥匙串 SecItemUpdate 修改现有的钥匙串项目。...如果密码不在keychain上,则SecItemCopyMatching返回errSecItemNotFound结果代码。在这种情况下,App显示一个对话框来请求用户名和密码。...当认证成功,应用程序可以认为用户输入信息是有效。然后应用程序显示另一个对话框,询问用户是否将密码保存在钥匙串上。如果用户选择否,则例程结束。...(CFDictionaryRef)keychainItem, (CFTypeRef *)&keyData) == noErr) { @try { ret = [NSKeyedUnarchiver

    92920

    Foundation framework in iOS

    bjective-c一般常用就是 Foundation framework。这里稍微介绍一些基础工具。点到即止 API 太多了,我也没时间花大篇幅翻译。用到哪儿就找哪儿API。...二者在类型上是不同,但是存储字符串是可以做对比。 NSMutbaleString就有点类似C#StringBuild这个,可以做一些字符串增删改操作。...常用用来包装这些类型有NSNumber NSValue NSValue NSValue可以包装任意一个对象,包括系统自定义数据结构,结构体等等 将结构体包装成OC对象: CGPoint p = CGPointMake...对象、NSArray对象 NSDictionary字典对象、NSData 数据对象、这些要进行数据保存可以通过NSKeyedArchive 来实现。...如果指定为NULL的话就会使用默认行为,返回值是BOOL类型方法,操作成功返回YES反之返回NO 判断文件是否被删除 if([fm removeItemAtPath:@"filename" error

    6210

    ·FMDB:第三方数据库处理框架·用法示例篇(附源码Demo)

    笔者曾查阅过FMDB示例用法一些文献,一部分有的只讲到FMDatabase,另一部分只讲专为多线程操作FMDatabaseQueue,很少有同时介绍两者用法区别的文章。这里,笔者做一个尝试。...其实FMDatabaseQueue这个对象已经把一个数据库和有关事务操作方法封装在一起了。一个FMDatabaseQueue实例对象里面包含一个FMDatabase数据库对象。...单线程生物:FMDatabase ---- 1.1 对FMDBFMDataBase进行一层封装 1.1.1 源码 DataBase.h // // DataBase.h // FMDBDemo...[[DataBase sharedDataBase] addPerson:person];中sharedDataBase方法返回一个该类静态实例static DataBase *_DBCtl。...多线程生物:FMDatabaseQueue ---- 2.1 封装 2.1.1 单例:负责创建FMDatabaseQueue和它数据库 DataBaseManager.m // // DataBaseManager.m

    98620

    iOS文件上传几种形式

    multipart/form-data形式可以附加其他参数 平常我们提交表单 RequestContent-Type为如下所示 Content-Type: application/x-www-form-urlencoded...如果我们上传表单中有文件 我们会设置表单enctype="multipart/form-data" 这时提交RequestContent-Type为如下所示 Content-Type: multipart...HTTP分片上传 方式一 HTTP形式 上面说了 大文件上传需要用Socket 其实用HTTPmultipart/form-data形式也可以 原理就是 上传把文件进行切片 提交除了文件data...同时传入 总片数 当前是第几片 服务端得到所有的数据片后合并数据 方式二 Socket形式 Socket上传 如果是大文件也是要进行分片 上传下载客户端 上传 - (void)viewDidLoad...,然后服务端根据其路径找到文件返回去 - (void)viewDidLoad { [super viewDidLoad]; self.fileData = [NSMutableData

    5.4K20

    【iOS开发】如何将 Array 存储在本地

    做开发时候,我们经常需要将数据保存在plist文件中,用这种方式来将数据写入磁盘,这样退出 App 再打开的话,上次写入文件还在。...NSArray 假如我自定义了一个Person来写人,然后用数组来存储Person对象,那么我将把这个数组初始化为 let personArray :[Person] = [Person]() 这时...想要把它存储在本地plist文件中,需要用到 NSKeyedArchiver 和 NSKeyedUnarchiver 但是在此之前,你需要把你改造一下。 ? 起初 ?...需要加入内容 你需要在你中实现 encode function,实现起来也很简单,见上图。...而一旦 encode 方法被实现,NSKeyedArchiver 和 NSKeyedUnarchiver 马上就被“解锁”并可以替代 writeToFile 方法啦! ?

    1.4K10

    iOS应用数据存储(数据持久化)常用方式一、iOS数据持久化方式二、应用沙盒(应用程序文件夹)三、使用方法

    (4)SQLite3,当非常大量数据存储使用 (5)Core Data,就是对SQLite封装 关于bundle路径和sandbox沙河路径: (1)bundle路径:应用程序 (APP)...(); Library/Caches: 保存临时文件,后续需要使用,例如:缓存图片,离线数据(地图数据) 系统不会清理cache目录中文件 就要求程序开发,必须提供cache目录清理解决方案...路径获取: 通过NSUserDefaults存取该目录下设置信息 ---- 三、使用方法 1、属性列表 属性列表是一种XML格式文件,拓展名为plist,如果对象是NSString、NSDictionary...、NSArray、NSData、NSNumber等类型,就可以使用, 注意:不能存储自定义对象,会失败 存方法:writeToFile 读方法:如字典, dictionaryWithContentsOfFile...2、偏好设置 通过NSUserDefaults就能直接访问软件偏好设置(Library/Preferences) UserDefaults设置数据,不是立即写入,而是根据时间戳定时地把缓存中数据写入本地磁盘

    2.6K70
    领券