Tôi đã có mã trông gần như chính xác những gì bạn đang làm và nhận được cảnh báo tương tự. Của tôi khác nhau một chút theo cách có liên quan đến các cuộc thảo luận
init<T>(from value: T) {
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
Điều này vẫn tạo ra cảnh báo rằng UnsafeBufferPulum đang tạo ra một Con trỏ lơ lửng nhưng gợi ý cho biết "chỉ tạo ra một con trỏ hợp lệ trong khoảng thời gian của lệnh gọi 'init (start: Count :)'"
Nhưng lợi nhuận từ UnsafeBufferPulum không được gán cho bất cứ điều gì, vì vậy tôi không thể sử dụng nó ngoài phạm vi của init nếu tôi đã thử. Vì vậy, trình biên dịch ở đây đang cảnh báo tôi không nên làm gì đó.
Tôi đoán Data.init (bộ đệm :) có thể lưu trữ ptr, nhưng tôi sẽ cho rằng nếu nó chấp nhận UnsafeBufferPulum, thì nó chấp nhận trách nhiệm sử dụng nó đúng cách
Dù sao, điều đó vẫn không thực sự khắc phục vấn đề của bạn. Tôi đã nhận được cảnh báo với điều này
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)
}
Và điều này không tạo ra cảnh báo và dường như hoạt động (trong ứng dụng của tôi dù sao). Cho dù nó vượt qua muster với các chuyên gia ở đây là một vấn đề khác.
Kiểu khiến tôi hoài niệm về những ngày của HLock và HUnlock