AutoreleasingUnsafeMutablePointer аварийно завершает работу приложения - PullRequest
1 голос
/ 20 апреля 2019

Я получаю некоторые данные из интернета и мне нужно угадать кодировку, если она не указана, поэтому я использую эту функцию 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 Ответ

1 голос
/ 20 апреля 2019

В вашем конкретном случае проблема заключается в том, что вы создали 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?
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...