Ich hatte Code, der fast genau so aussah, wie Sie es taten, und der die gleiche Warnung erhielt. Meins unterschied sich geringfügig in einer Weise, die für die Diskussion relevant ist
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
Dies erzeugt immer noch die Warnung, dass UnsafeBufferPointer einen baumelnden Zeiger erzeugt, aber die Hinweise besagen "erzeugt einen Zeiger, der nur für die Dauer des Aufrufs von 'init (start: count :)' gültig ist".
Die Rückgabe von UnsafeBufferPointer ist jedoch nichts zugewiesen, sodass ich sie nicht außerhalb des Bereichs des Init verwenden könnte, wenn ich es versuchen würde. Der Compiler hier warnt mich also davor, etwas zu tun, was ich sowieso nicht tun kann.
Ich denke, Data.init (buffer :) könnte den ptr speichern, aber ich würde annehmen, dass wenn es einen UnsafeBufferPointer akzeptiert, es die Verantwortung für die ordnungsgemäße Verwendung übernimmt
Wie auch immer, das behebt Ihr Problem immer noch nicht wirklich. Damit habe ich die Warnung umgangen
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)
}
Und dies erzeugt keine Warnung und scheint zu funktionieren (in meiner Anwendung sowieso). Ob es hier mit den Experten zusammenkommt, ist eine andere Frage.
Das macht mich irgendwie nostalgisch für die Tage von HLock und HUnlock