Miałem kod, który wyglądał prawie dokładnie to, co robisz, i otrzymywałem to samo ostrzeżenie. Mój różni się nieznacznie w sposób istotny dla dyskusji
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
Nadal generuje to ostrzeżenie, że UnsafeBufferPointer produkuje zwisający wskaźnik, ale podpowiedzi mówią „produkuje wskaźnik ważny tylko przez czas trwania wywołania„ init (start: count :) ””
Ale powrót z UnsafeBufferPointer nie jest przypisany do niczego, więc nie mogłem użyć go poza zakresem init, gdybym spróbował. Kompilator tutaj ostrzega mnie przed zrobieniem czegoś, czego i tak nie mogę zrobić.
Wydaje mi się, że Data.init (bufor:) może przechowywać ptr, ale zakładam, że jeśli zaakceptuje wskaźnik UnsafeBufferPointer, przyjmuje odpowiedzialność za prawidłowe użycie go
W każdym razie nadal nie rozwiązuje to problemu. Dzięki temu udało mi się obejść ostrzeżenie
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)
}
I to nie generuje ostrzeżenia i wydaje się działać (i tak w mojej aplikacji). To, czy przejdzie to w sporze z ekspertami, to inna sprawa.
Niby nostalgicznie za dniami HLock i HUnlock