将非托管与nil进行比较

该代码是从以下博客文章中复制而来的: 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() 

当我在keychain查询中使用新帐户值运行上述操作时, dataTypeRef将为nil ,这将导致EXEC_BAD_ACCESS

我试图通过检查dataTypeRef是否为n来绕过这个:

 var opaque = COpaquePointer.null() if (dataTypeRef != nil) { opaque = dataTypeRef!.toOpaque() // This line should not be executed. } 

虽然调试器显示dataTypeRefnil但仍然会输入if子句并崩溃。

谁能解释一下这里发生了什么? 我确实有Objective-C的经验,但我无法弄清楚这里发生了什么。

据我所知,不再需要toOpaque/fromOpaque舞蹈,你可以简单地使用可选的绑定。 这可以使用可选链接与NSData组合到NSData

 let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData { contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding) } 

另请注意, takeRetainedValue()在此处是正确的选择,因为您“拥有” SecItemCopyMatching返回的SecItemCopyMatching (其名称中包含“Copy”)。

但实际上你应该先检查返回值

 let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) if status == errSecSuccess { if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData { contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding) } }