首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unmanaged<AnyObject>与零的比较

Unmanaged<AnyObject>与零的比较
EN

Stack Overflow用户
提问于 2014-10-27 18:06:30
回答 1查看 1.3K关注 0票数 3

代码是从以下博客文章中复制的:http://matthewpalmer.net/blog/2014/06/21/example-ios-keychain-swift-save-query/

我以前有这样的代码:

代码语言:javascript
复制
// Search for the keychain items
let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)

// The following line crashes with an EXEC_BAD_ACCESS if dataTypeRef is nil
var opaque = dataTypeRef!.toOpaque()

当我使用密钥链查询中的新帐户值运行上面的内容时,dataTypeRef将是nil,这将导致EXEC_BAD_ACCESS

我试图通过检查dataTypeRef是否是nil这样来规避这个问题:

代码语言:javascript
复制
var opaque = COpaquePointer.null()
if (dataTypeRef != nil) {
    opaque = dataTypeRef!.toOpaque()    // This line should not be executed.
}

虽然调试器显示dataTypeRefnil,但它仍然将输入if子句和崩溃。

有人能解释一下这是怎么回事吗?我确实在目标C方面有经验,但我不知道这是怎么回事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-27 19:06:14

据我所知,toOpaque/fromOpaque舞蹈已不再必要,您可以简单地使用可选绑定。可以使用可选链接将其与强制转换为NSData结合起来:

代码语言:javascript
复制
let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData {
    contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding)
}

还请注意,takeRetainedValue()是这里的正确选择,因为您“拥有”SecItemCopyMatching返回的项(它的名称中有“复制”)。

但实际上,您应该首先检查返回值:

代码语言:javascript
复制
let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
if status == errSecSuccess {
    if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData {
        contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding)
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26593980

复制
相关文章

相似问题

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