AutoreleasingUnsafeMutablePointer使应用程序崩溃

时间:2019-04-20 05:33:08

标签: swift

我从互联网上收到了一些数据,如果没有提供编码,则需要猜测编码,因此我使用此功能stringEncoding(for:encodingOptions:convertedString:usedLossyConversion:),并且它需要传递AutoreleasingUnsafeMutablePointer来接收转换后的字符串,我编写了如下代码这个:

var str = "Hello, playground"

func decode(data: Data) -> String? {
    var covertedString = NSString()
    let stringPointer = AutoreleasingUnsafeMutablePointer<NSString?>(&covertedString)
    guard NSString.stringEncoding(for: data, encodingOptions: nil, convertedString: stringPointer, usedLossyConversion: nil) != 0 else {
        return nil
    }
    return covertedString as String
}

let data = str.data(using: .utf8)!
decode(data: data)

虽然我退出函数调用的covertedString是正确的,但应用程序总是崩溃。知道为什么AutoreleasingUnsafeMutablePointer会崩溃吗?我试图不通过convertedString,所以它不再崩溃,因此看起来是根本原因。知道为什么它崩溃了吗?

我正在将Xcode版本10.1(10B61)与Swift 4配合使用

1 个答案:

答案 0 :(得分:1)

在您的特定情况下,问题在于您创建了一个NSString,但随后获得了指向NSString?的指针,这是另一回事。

但这在这里并不重要。您不会直接创建AutoreleasingUnsafeMutablePointer(或通常任何类型的UnsafePointer)。在您使用它们时,它们不会被保证是有效的。而是使用&隐式创建它们。

func decode(data: Data) -> String? {
    var convertedString: NSString? = ""   // <- Make sure to make this optional
    guard NSString.stringEncoding(for: data,
                                  encodingOptions: nil,
                                  convertedString: &convertedString,  // <- Use &
                                  usedLossyConversion: nil) != 0
        else {
            return nil
    }
    return convertedString as String?
}