Po aktualizacji do Swift 5.2 / Xcode 11.4 pojawiło się ostrzeżenie do następującego kodu:
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) }
}
}
On line niech wskaźnik = UnsafeBufferPointer (start: i wartość, liczba: 1) Mam
Inicjalizacja „UnsafeBufferPointer” powoduje zwisający wskaźnik bufora
Mogę użyć @silenceWarning, ale to brudne rozwiązanie. Może muszę gdzieś przechowywać wskaźnik i czyścić go w przyszłości?
swift
unsafe-pointers
swift5.2
xcode11.4
Exey Panteleev
źródło
źródło
Odpowiedzi:
To nigdy nie było bezpieczne, więc cieszę się, że zespół Swift go wyczyścił:
Na końcu tego wiersza kodu
pointer
jest natychmiast nieważny. Nie ma obietnicy, któravalue
istnieje nawet w następnym wierszu kodu. Nie jestem pewien, co próbowaliście tutaj osiągnąć, ale nigdy nie był to bezpieczny sposób. Prawdopodobnie szukasz jednej z.withUnsafeBytes
metod, która zależy od tego, nad czym pracowałeś.źródło
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
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
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
źródło
Spotkałem także te irytujące ostrzeżenia.
Biorąc pod uwagę odpowiedź @ Greg, wkładam
Data.append
wwithUnsafePointer
„s zamknięcia, i nie wykazuje już ostrzeżenia.Oto rozszerzenie
źródło
append(.init(value: value))