将 nil 传递给 archivedDataWithRootObject 返回奇怪的 NSData

Posted

技术标签:

【中文标题】将 nil 传递给 archivedDataWithRootObject 返回奇怪的 NSData【英文标题】:Pass nil to archivedDataWithRootObject return weird NSData 【发布时间】:2014-05-24 07:11:54 【问题描述】:

在我的代码中的某个地方

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:someArray];

如果someArraynil,我希望datanil,但它会返回一些我不理解的数据。

我打印出来如下 <62706c69 73743030 d4010203 0405080a 0b542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d106 0754726f 6f748000 a1095524 6e756c6c 12000186 a05f100f 4e534b65 79656441 72636869 76657208 11161f28 32353a3c 3e444900 00000000 00010100 00000000 00000c00 00000000 00000000 00000000 00005b>

我尝试NSData *data = [NSKeyedArchiver archivedDataWithRootObject:nil]; 以确保参数肯定为零。

我阅读了文档,但找不到任何解释。

那么这里到底发生了什么?

编辑 我将数据写入文件,结果是这样的 plist。这可能是 NSKeyedArchiver 存储对象的方式。

【问题讨论】:

【参考方案1】:

该数据看起来像一个“空”plist。您可以将其转换为字符串并将其记录下来以进行检查。因为归档器使用固定格式,所以您总是会得到一个数据包装器。

从技术上讲,它可以被编码,这样就没有必要了,但你无法控制它。

如果您不需要为 nil 或空源数组创建存档,那么您的代码应该检查并且不执行存档(并在需要时删除任何现有的存档文件)。

【讨论】:

以上是关于将 nil 传递给 archivedDataWithRootObject 返回奇怪的 NSData的主要内容,如果未能解决你的问题,请参考以下文章

将展开的值传递给 Text() 成功,但传递给 Link() 会导致“在展开可选值时意外发现 nil”

防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法

NSManagedObjectContext 传递给 NSWindowController 变为 nil

可以将 NULL 传递给块参数吗?

将数组传递给 ios sdk 中的 .net webservice

如何在 swift 中将 JSON `null` 值传递给`nil` 值?