AutoreleasingUnsafeMutablePointer使应用程序崩溃

问题描述 投票:1回答:1

我收到一些来自互联网的数据,如果没有提供,需要猜测编码,所以我使用这个函数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

swift
1个回答
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?
}
© www.soinside.com 2019 - 2024. All rights reserved.