Swift Language
(Onveilige) bufferaanwijzers
Zoeken…
Invoering
“Een bufferpointer wordt gebruikt voor toegang op laag niveau tot een geheugengebied. Je kunt bijvoorbeeld een bufferpointer gebruiken voor efficiënte verwerking en communicatie van gegevens tussen apps en services. ”
Fragment uit: Apple Inc. "Swift gebruiken met Cocoa en Objective-C (Swift 3.1-editie)." iBooks. https://itun.es/us/utTW7.l
U bent verantwoordelijk voor het omgaan met de levenscyclus van elk geheugen waarmee u werkt via bufferaanwijzers om lekken of ongedefinieerd gedrag te voorkomen.
Opmerkingen
Nauwkeurige concepten die nodig zijn om iemands begrip van (onveilige) BufferPointers te voltooien.
- MemoryLayout ( de geheugenlay-out van een type, die de grootte, stap en uitlijning beschrijft .)
- Onbeheerd ( een type voor het propageren van een onbeheerde objectreferentie .)
- UnsafeBufferPointer ( Een verzamelinginterface die geen eigendom is van een buffer van elementen die aaneengesloten in het geheugen zijn opgeslagen .)
- UnsafeBufferPointerIterator ( Een iterator voor de elementen in de buffer waarnaar wordt verwezen door een UnsafeBufferPointer of UnsafeMutableBufferPointer-instantie .)
- UnsafeMutableBufferPointer ( Een verzamelinginterface die geen eigendom is van een buffer van veranderlijke elementen die aaneengesloten in het geheugen zijn opgeslagen. )
- UnsafeMutablePointer ( een aanwijzer voor toegang tot en manipulatie van gegevens van een specifiek type. )
- UnsafeMutableRawBufferPointer ( Een veranderlijke niet-eigen verzamelinginterface voor de bytes in een geheugengebied. )
- UnsafeMutableRawBufferPointer.Iterator ( Een iterator over de bytes bekeken door een onbewerkte bufferpointer. )
- UnsafeMutableRawPointer ( Een onbewerkte aanwijzer voor toegang tot en manipulatie van niet-getypeerde gegevens. )
- UnsafePointer ( een aanwijzer voor toegang tot gegevens van een specifiek type. )
- UnsafeRawBufferPointer ( Een niet-verzamelde interface voor de bytes in een geheugengebied. )
- UnsafeRawBufferPointer.Iterator ( Een iterator over de bytes bekeken door een onbewerkte bufferpointer. )
- UnsafeRawPointer ( Een onbewerkte aanwijzer voor toegang tot ongetypeerde gegevens. )
(Bron, Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
Een aanwijzer voor toegang tot en manipulatie van gegevens van een specifiek type.
U gebruikt instanties van het type UnsafeMutablePointer om toegang te krijgen tot gegevens van een specifiek type in het geheugen. Het type gegevens waartoe een aanwijzer toegang heeft, is het Pointee-type van de aanwijzer. UnsafeMutablePointer biedt geen geautomatiseerd geheugenbeheer of uitlijningsgaranties. U bent verantwoordelijk voor het afhandelen van de levenscyclus van elk geheugen waarmee u werkt via onveilige aanwijzingen om lekken of ongedefinieerd gedrag te voorkomen.
Geheugen dat u handmatig beheert, kan ongetyped zijn of gebonden zijn aan een specifiek type. U gebruikt het type UnsafeMutablePointer voor toegang tot en beheer van geheugen dat aan een specifiek type is gebonden. ( Bron )
import Foundation
let arr = [1,5,7,8]
let pointer = UnsafeMutablePointer<[Int]>.allocate(capacity: 4)
pointer.initialize(to: arr)
let x = pointer.pointee[3]
print(x)
pointer.deinitialize()
pointer.deallocate(capacity: 4)
class A {
var x: String?
convenience init (_ x: String) {
self.init()
self.x = x
}
func description() -> String {
return x ?? ""
}
}
let arr2 = [A("OK"), A("OK 2")]
let pointer2 = UnsafeMutablePointer<[A]>.allocate(capacity: 2)
pointer2.initialize(to: arr2)
pointer2.pointee
let y = pointer2.pointee[1]
print(y)
pointer2.deinitialize()
pointer2.deallocate(capacity: 2)
Geconverteerd naar Swift 3.0 vanaf de originele bron
Praktische use-case voor bufferaanwijzers
Deconstructie van het gebruik van een onveilige aanwijzer in de Swift-bibliotheekmethode;
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
Doel:
Hiermee maakt u een nieuwe tekenreeks door de UTF-8-gegevens met nul beëindiging te kopiëren en te valideren waarnaar door de gegeven aanwijzer wordt verwezen.
Deze initialisator probeert geen slecht gevormde UTF-8 code-eenheidsequenties te repareren. Als er iets wordt gevonden, is het resultaat van de initialisatie nil
. Het volgende voorbeeld noemt dit initialisatieprogramma met verwijzingen naar de inhoud van twee verschillende CChar
arrays --- de eerste met goed gevormde UTF-8 code-eenheidsequenties en de tweede met een slecht gevormde sequentie aan het einde.
Bron , Apple Inc., Swift 3 header-bestand (voor header-toegang: In Playground, Cmd + klik op het woord Swift) in de coderegel:
import Swift
let validUTF8: [CChar] = [67, 97, 102, -61, -87, 0]
validUTF8.withUnsafeBufferPointer { ptr in
let s = String(validatingUTF8: ptr.baseAddress!)
print(s as Any)
}
// Prints "Optional(Café)"
let invalidUTF8: [CChar] = [67, 97, 102, -61, 0]
invalidUTF8.withUnsafeBufferPointer { ptr in
let s = String(validatingUTF8: ptr.baseAddress!)
print(s as Any)
}
// Prints "nil"
(Bron, Apple Inc., Voorbeeld van snelle koptekst)