Avevo un codice che sembrava quasi esattamente quello che stavi facendo e stava ricevendo lo stesso avvertimento. Il mio differiva leggermente in un modo rilevante per la discussione
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
Questo genera ancora l'avvertimento che UnsafeBufferPointer sta producendo un puntatore penzolante ma i suggerimenti dicono "produce un puntatore valido solo per la durata della chiamata a 'init (start: count :)'"
Ma il ritorno da UnsafeBufferPointer non è assegnato a nulla, quindi non ho potuto usarlo al di fuori dell'ambito dell'init se avessi provato. Quindi il compilatore qui mi sta mettendo in guardia dal fare qualcosa che non posso fare comunque.
Immagino che Data.init (buffer:) potrebbe archiviare il ptr, ma suppongo che se accetta un UnsafeBufferPointer, si accetta la responsabilità di usarlo correttamente
Comunque, ciò non risolve ancora il tuo problema. Ho aggirato l'avvertimento con questo
init<T>(from value: T) {
var value = value
var myData = Data()
withUnsafePointer(to:&value, { (ptr: UnsafePointer<T>) -> Void in
myData = Data( buffer: UnsafeBufferPointer(start: ptr, count: 1))
})
self.init(myData)
}
E questo non genera l'avviso e sembra funzionare (nella mia applicazione comunque). Se passa qui con gli esperti qui è un'altra questione.
Un po 'mi rende nostalgico per i giorni di HLock e HUnlock