Setelah pembaruan ke Swift 5.2 / Xcode 11.4 mendapat peringatan untuk kode berikut:
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) }
}
}
Point let let on line = UnsafeBufferPointer (mulai: & nilai, hitung: 1) saya dapatkan
Inisialisasi hasil 'UnsafeBufferPointer' di pointer buffer menggantung
Saya bisa menggunakan @silenceWarning tapi ini solusi kotor. Mungkin saya perlu menyimpan pointer di suatu tempat dan membersihkannya di masa depan?
swift
unsafe-pointers
swift5.2
xcode11.4
Exey Panteleev
sumber
sumber
Jawaban:
Ini tidak pernah aman, sangat senang bahwa tim Swift telah membersihkannya:
Pada akhir baris kode ini,
pointer
langsung tidak valid. Tidak ada janji yangvalue
bahkan ada di baris kode berikutnya. Saya tidak yakin apa yang ingin Anda capai di sini, tetapi ini tidak pernah cara yang aman untuk melakukannya. Apa yang mungkin Anda cari adalah salah satu.withUnsafeBytes
metode, yang tergantung pada apa yang sedang Anda kerjakan.sumber
Saya memiliki kode yang terlihat hampir persis seperti apa yang Anda lakukan dan mendapatkan peringatan yang sama. Milik saya sedikit berbeda dengan cara yang relevan dengan diskusi
Ini masih menghasilkan peringatan bahwa UnsafeBufferPointer menghasilkan Pointer menggantung tetapi petunjuk mengatakan "menghasilkan pointer yang hanya valid selama durasi panggilan untuk 'init (start: count :)'"
Tetapi pengembalian dari UnsafeBufferPointer tidak ditugaskan untuk apa pun, jadi saya tidak bisa menggunakannya di luar ruang lingkup init jika saya mencoba. Jadi kompiler di sini memperingatkan saya untuk tidak melakukan sesuatu yang tidak bisa saya lakukan.
Saya kira Data.init (buffer:) dapat menyimpan ptr, tetapi saya akan menganggap bahwa jika ia menerima UnsafeBufferPointer, ia menerima tanggung jawab untuk menggunakannya dengan benar
Bagaimanapun, itu masih tidak benar-benar memperbaiki masalah Anda. Saya mendapat peringatan dengan ini
Dan ini tidak menghasilkan peringatan dan tampaknya berfungsi (dalam aplikasi saya sih). Apakah hal itu sesuai dengan para ahli di sini adalah masalah lain.
Agak membuat saya nostalgia untuk hari-hari HLock dan HUnlock
sumber
Saya juga bertemu peringatan yang menjengkelkan ini.
Mengingat jawaban @ greg, saya menempatkan
Data.append
ke dalamwithUnsafePointer
's penutupan, dan tidak menunjukkan peringatan lagi.Ini ekstensi
sumber
append(.init(value: value))