После обновления до Swift 5.2 / Xcode 11.4 появилось предупреждение о следующем коде:
extension Data {
init<T>(from value: T) {
var value = value
let pointer = UnsafeBufferPointer(start: &value, count: 1)
self.init(buffer: pointer)
}
func to<T>(type: T.Type) -> T {
return self.withUnsafeBytes { $0.load(as: T.self) }
}
}
В строке пусть указатель = UnsafeBufferPointer (начало: & значение, количество: 1) я получил
Инициализация «UnsafeBufferPointer» приводит к зависанию указателя буфера
Я могу использовать @silenceWarning, но это грязное решение. Может быть, мне нужно где-то хранить указатель и очистить его в будущем?
swift
unsafe-pointers
swift5.2
xcode11.4
Эксей Пантелеев
источник
источник
Ответы:
Это никогда не было безопасно, так рад, что команда Swift исправила это:
В конце этой строки кода,
pointer
сразу же становится недействительным. Там нет обещания, чтоvalue
даже существует в следующей строке кода. Я не уверен, чего вы пытались достичь здесь, но это никогда не было безопасным способом сделать это. Вероятно, вы ищете один из.withUnsafeBytes
методов, который зависит от того, над чем вы работали.источник
У меня был код, который выглядел почти точно, что вы делали, и получал то же предупреждение. Мой немного отличался таким образом, который имеет отношение к обсуждению
Это по-прежнему генерирует предупреждение о том, что UnsafeBufferPointer создает висячий указатель, но подсказки говорят: «создает указатель, действительный только на время вызова init (start: count :) '»
Но возврат из UnsafeBufferPointer ни к чему не привязан, поэтому я не смог использовать его вне области init, если попытался. Так что компилятор здесь предупреждает меня о том, чтобы я не делал то, что я не могу сделать.
Я думаю, Data.init (buffer:) может хранить ptr, но я предполагаю, что если он принимает UnsafeBufferPointer, он принимает на себя ответственность за его правильное использование
В любом случае, это все еще не решит твою проблему. Я обошел предупреждение с этим
И это не генерирует предупреждение и, кажется, работает (в любом случае, в моем приложении). Вопрос о том, пройдет ли это экспертами, - это другой вопрос.
В некотором роде я испытываю ностальгию по временам HLock и HUnlock
источник
Я также встретил эти досадные предупреждения.
Принимая во внимание ответ @ greg, я помещаю его
Data.append
вwithUnsafePointer
закрытие, и оно больше не показывает предупреждений.Вот расширение
источник
append(.init(value: value))