Swift Language
(Osäker) Buffertpekare
Sök…
Introduktion
”En buffertpekare används för åtkomst till låg nivå till ett minneområde. Till exempel kan du använda en buffertpekare för effektiv bearbetning och kommunikation av data mellan appar och tjänster. "
Utdrag från: Apple Inc. "Att använda Swift med kakao och Objekt-C (Swift 3.1 Edition)." iBooks. https://itun.es/us/utTW7.l
Du ansvarar för att hantera livscykeln för alla minne du arbetar med genom buffertpekare för att undvika läckor eller odefinierat beteende.
Anmärkningar
Nära anpassade koncept som krävs för att fullborda förståelsen för (osäkra) BufferPointers.
- MemoryLayout ( minneslayouten för en typ som beskriver dess storlek, steg och inriktning .)
- Unmanaged ( En typ för att sprida en obemanad objektreferens .)
- UnsafeBufferPointer ( Ett icke-ägande samlingsgränssnitt till en buffert av element lagrade sammanhängande i minnet .)
- UnsafeBufferPointerIterator ( En iterator för elementen i bufferten som refereras av en UnsafeBufferPointer- eller UnsafeMutableBufferPointer-instans .)
- UnsafeMutableBufferPointer ( Ett icke-ägande samlingsgränssnitt till en buffert av muterbara element lagrade sammanhängande i minnet. )
- UnsafeMutablePointer ( En pekare för åtkomst och manipulering av data av en viss typ. )
- UnsafeMutableRawBufferPointer ( Ett muterbart gränssnitt för icke-varande samling till byte i en minnesregion. )
- UnsafeMutableRawBufferPointer.Iterator ( En iterator över byte som visas av en rå buffertpekare. )
- UnsafeMutableRawPointer ( En rå pekare för åtkomst och manipulering av otysta data. )
- UnsafePointer ( En pekare för åtkomst till data av en viss typ. )
- UnsafeRawBufferPointer ( Ett gränssnitt för icke- varande samling till byte i en minnesregion. )
- UnsafeRawBufferPointer.Iterator ( En iterator över byte som visas av en rå buffertpekare. )
- UnsafeRawPointer ( En rå pekare för åtkomst till otysta data. )
(Källa, Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
En pekare för åtkomst och manipulering av data av en viss typ.
Du använder instanser av typen UnsafeMutablePointer för att komma åt data av en specifik typ i minnet. Typen av data som en pekare kan komma åt är pekarens Pointee-typ. UnsafeMutablePointer ger inga automatiserade minneshanterings- eller justeringsgarantier. Du ansvarar för att hantera livscykeln för alla minne du arbetar med genom osäkra pekare för att undvika läckor eller odefinierat beteende.
Minne som du hanterar manuellt kan vara antingen typ eller bundet till en specifik typ. Du använder UnsafeMutablePointer-typen för att komma åt och hantera minne som är bundet till en viss typ. ( Källa )
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)
Omvandlas till Swift 3,0 från original- källa
Praktiskt användningsfall för buffertpekare
Dekonstruera användningen av en osäker pekare i metoden Swift-bibliotek;
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
Ändamål:
Skapar en ny sträng genom att kopiera och validera de noll-avslutade UTF-8-uppgifterna som den givna pekaren refererar till.
Denna initierare försöker inte reparera felformade UTF-8-kodenhetssekvenser. Om något hittas är resultatet av initialiseraren nil
. Följande exempel kallar denna initierare med pekare på innehållet i två olika CChar
matriser --- det första med välformade UTF-8-kodsenhetssekvenser och det andra med en dåligt formad sekvens i slutet.
Source , Apple Inc., huvudfil för Swift 3 (för huvudåtkomst: I Playground, Cmd + Klicka på ordet Swift) i kodraden:
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"
(Source, Apple Inc., Exempel på Swift Header File)