【问题标题】:Comparing Unmanaged<AnyObject> to nil将 Unmanaged<AnyObject> 与 nil 进行比较
【发布时间】:2014-10-27 18:06:30
【问题描述】:

代码复制自这篇博文: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()

当我在钥匙串查询中使用新帐户值运行上述操作时,dataTypeRef 将是 nil,这会导致 EXEC_BAD_ACCESS

我试图通过检查dataTypeRef 是否为nil 来规避这种情况:

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

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

谁能解释这里发生了什么?我确实有 Objective-C 方面的经验,但我不知道这里发生了什么。

【问题讨论】:

    标签: ios swift xcode6.1


    【解决方案1】:

    据我所知,toOpaque/fromOpaque 的舞蹈已经没有必要了,而你 可以简单地使用可选绑定。这可以与演员组合到NSData 使用可选链:

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

    还要注意takeRetainedValue() 是正确的选择,因为您“拥有” SecItemCopyMatching 返回的项目(名称中包含“复制”)。

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

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

    【讨论】:

    • 虽然我理解if let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData 的含义,但我认为它很丑陋。是否有理由不使用let retrievedData = dataTypeRef?.takeRetainedValue() as? NSData 后跟if nil != retrievedData
    • @Paul: if let retrievedData = ... 是一个“可选绑定”,因此如果执行 if 块,retrievedData 包含 unwrapped 变量。 let retrievedData = ...; if nil != retrievedData { ... } 也是可能的,但是retrievedData 是一个可选,它仍然需要用!:contentsOfKeychain = NSString(data: retrievedData!, ...) 解包。这就是为什么我更喜欢第一种方法,但两者都有效。
    • 感谢您的澄清。为了易读,我更喜欢我的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多