首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift UnsafePointer<T>(data.bytes).memory在某些(但不是全部)情况下崩溃

Swift UnsafePointer<T>(data.bytes).memory在某些(但不是全部)情况下崩溃
EN

Stack Overflow用户
提问于 2015-04-28 01:38:16
回答 1查看 622关注 0票数 1

我有以下结构:

代码语言:javascript
运行
复制
struct Identity {
    var id: Int
    var createdAt: NSDate
    var string: String
    var apnsToken: String
}

在我的应用程序执行过程中,实例(?)将此结构转换为NSData (使用以下代码)并存储在NSUserDefaults

代码语言:javascript
运行
复制
var id = Identity(id: 0, createdAt: NSDate(), string: "string", apnsToken: "<apns-token-here>")
var data = NSData(bytesNoCopy: &id, length: sizeof(Identity),freeWhenDone:false)

当我试图从NSData实例获取一个结构时,它会使用一个EXC_BAD_ACCESS (它是一个代码1)崩溃:

代码语言:javascript
运行
复制
var id = UnsafePointer<Identity>(userDefaultsData.bytes).memory

但是,只有当我从NSData中获得NSUserDefaults实例时,才会发生这种情况。如果我做了下面这样的事情,它在没有崩溃的情况下工作。

代码语言:javascript
运行
复制
var id = Identity(id: 0, createdAt: NSDate(), string: "string", apnsToken: "<apns-token-here>")
var data = NSData(bytesNoCopy: &id, length: sizeof(Identity),freeWhenDone:false)
var idPrime = UnsafePointer<Identity>(data.bytes).memory

EXC_BAD_ACCESS转储的程序集代码在objc_retain的一半处,在and指令之后。

更新:

我不是完全诚实的。数据从ObjC中的密钥链中检索,bridge_transfer从CF数据对象转换为NSData。CF对象作为out param来自SecItemCopy()。我以为NSUserDefaults会更有关系。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-28 04:04:27

这是因为这一行:

代码语言:javascript
运行
复制
var data = NSData(bytesNoCopy: &id, length: sizeof(Identity),freeWhenDone:false)

不会将String(或任何分配自己内存(如数组)的其他类型)呈现为字节形式。相反,它所要做的就是将指向字符串的内存的指针序列化为NSData字节。

如果记忆不再存在,这显然会导致爆炸。这就是为什么当你一次完成所有的工作时,它似乎是有效的,而不是当你存储到用户的缺省值,然后,然后,甚至在一个不同的过程中,把它拿出来。

相反,您需要做一些事情,比如将字符串存储到自己的NSData对象中(比如使用NSData(base64EncodedString:options:)),然后也存储它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29908816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档