Pau*_*aul 3 ios swift xcode6.1
该代码是从以下博客文章中复制而来的:http://matthewpalmer.net/blog/2014/06/21/example-ios-keychain-swift-save-query/
我以前有这个代码:
// 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()
Run Code Online (Sandbox Code Playgroud)
当我在钥匙串查询中使用新帐户值运行上述操作时,dataTypeRef将nil导致一个EXEC_BAD_ACCESS.
我试图通过检查是否dataTypeRef是nil这样来绕过这个:
var opaque = COpaquePointer.null()
if (dataTypeRef != nil) {
opaque = dataTypeRef!.toOpaque() // This line should not be executed.
}
Run Code Online (Sandbox Code Playgroud)
虽然调试器显示dataTypeRef是nil它仍然会进入if语句和崩溃.
谁能解释一下这里发生了什么?我确实有Objective-C的经验,但我无法弄清楚这里发生了什么.
据我所知,toOpaque/fromOpaque舞蹈不再是必要的,你可以简单地使用可选的绑定.这可以与NSData
使用可选链接的强制转换组合:
let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData {
contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding)
}
Run Code Online (Sandbox Code Playgroud)
另请注意,这takeRetainedValue()是正确的选择,因为您"拥有"由其返回的项目SecItemCopyMatching(其名称中包含"复制").
但实际上你应该首先检查返回值:
let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
if status == errSecSuccess {
if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData {
contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1206 次 |
| 最近记录: |