Após a atualização para o Swift 5.2 / Xcode 11.4, recebi um aviso para o seguinte código:
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) }
}
}
On line deixe ponteiro = UnsafeBufferPointer (start: & valor, a contagem: 1) Eu tenho
A inicialização de 'UnsafeBufferPointer' resulta em um ponteiro de buffer pendente
Posso usar @silenceWarning, mas é uma solução suja. Talvez eu precise armazenar o ponteiro em algum lugar e limpá-lo no futuro?
swift
unsafe-pointers
swift5.2
xcode11.4
Exey Panteleev
fonte
fonte
Respostas:
Isso nunca foi seguro, tão feliz que a equipe Swift o limpou:
No final desta linha de código,
pointer
é imediatamente inválido. Não há promessa de quevalue
exista na próxima linha de código. Não tenho certeza do que você estava tentando alcançar aqui, mas nunca foi uma maneira segura de fazer isso. O que você provavelmente está procurando é um dos.withUnsafeBytes
métodos, que depende do que você estava trabalhando.fonte
Eu tinha um código que parecia quase exatamente o que você estava fazendo e estava recebendo o mesmo aviso. Os meus diferiram ligeiramente de uma maneira que é relevante para a discussão
Isso ainda gera o aviso de que o UnsafeBufferPointer está produzindo um ponteiro pendente, mas as dicas dizem "produz um ponteiro válido apenas pela duração da chamada para 'init (start: count :)'"
Mas o retorno de UnsafeBufferPointer não está atribuído a nada, então eu não poderia usá-lo fora do escopo do init se tentasse. Portanto, o compilador aqui está me alertando contra fazer algo que não posso fazer de qualquer maneira.
Eu acho que Data.init (buffer :) poderia estar armazenando o ptr, mas eu assumiria que, se ele aceita um UnsafeBufferPointer, está aceitando a responsabilidade de usá-lo corretamente
Enfim, isso ainda não resolve o seu problema. Eu contornei o aviso com isso
E isso não gera o aviso e parece funcionar (no meu aplicativo de qualquer maneira). A questão de saber se é aprovada pelos especialistas aqui é outra questão.
Meio que me deixa nostálgico pelos dias de HLock e HUnlock
fonte
Eu também recebi esses avisos irritantes.
Considerando @ resposta de Greg, eu coloquei o
Data.append
nowithUnsafePointer
fechamento 's, e ele não mostra advertências mais.Aqui está a extensão
fonte
append(.init(value: value))