Swift Language
Puntatori di buffer (non sicuri)
Ricerca…
introduzione
"Un puntatore del buffer viene utilizzato per l'accesso a basso livello a una regione di memoria. Ad esempio, è possibile utilizzare un puntatore del buffer per l'elaborazione efficiente e la comunicazione dei dati tra app e servizi. "
Estratto da: Apple Inc. "Uso di Swift con Cocoa e Objective-C (Swift 3.1 Edition)." IBooks. https://itun.es/us/utTW7.l
Sei responsabile della gestione del ciclo di vita di qualsiasi memoria con cui lavori con i puntatori del buffer, per evitare perdite o comportamenti non definiti.
Osservazioni
Concetti strettamente allineati richiesti per completare la comprensione dei BufferPointer (non sicuri).
- MemoryLayout ( il layout di memoria di un tipo, descrivendo le sue dimensioni, passo e allineamento ).
- Non gestito ( Un tipo per propagare un riferimento a un oggetto non gestito .)
- UnsafeBufferPointer ( un'interfaccia di raccolta non proprietaria di un buffer di elementi memorizzati in modo contiguo nella memoria ).
- UnsafeBufferPointerIterator ( un iteratore per gli elementi nel buffer a cui fa riferimento un'istanza UnsafeBufferPointer o UnsafeMutableBufferPointer ).
- UnsafeMutableBufferPointer ( un'interfaccia di raccolta non proprietaria di un buffer di elementi mutabili memorizzati in modo contiguo nella memoria ) .
- UnsafeMutablePointer ( puntatore per l'accesso e la manipolazione dei dati di un tipo specifico ) .
- UnsafeMutableRawBufferPointer ( Un'interfaccia di raccolta nono mutabile per i byte in una regione di memoria. )
- UnsafeMutableRawBufferPointer.Iterator ( un iteratore sui byte visualizzati da un puntatore del buffer raw ) .
- UnsafeMutableRawPointer ( Un puntatore raw per accedere e manipolare dati non tipizzati ) .
- UnsafePointer ( puntatore per accedere ai dati di un tipo specifico ) .
- UnsafeRawBufferPointer ( un'interfaccia di raccolta nonown ai byte in una regione di memoria ) .
- UnsafeRawBufferPointer.Iterator ( un iteratore sui byte visualizzati da un puntatore del buffer raw ) .
- UnsafeRawPointer ( Un puntatore raw per accedere a dati non tipizzati ) .
(Fonte, Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
Un puntatore per accedere e manipolare i dati di un tipo specifico.
Si utilizzano istanze del tipo UnsafeMutablePointer per accedere ai dati di un tipo specifico in memoria. Il tipo di dati a cui un puntatore può accedere è il tipo Pointee del puntatore. UnsafeMutablePointer non fornisce alcuna garanzia automatica di gestione della memoria o allineamento. Sei responsabile della gestione del ciclo di vita di qualsiasi memoria con cui lavori con puntatori non sicuri per evitare perdite o comportamenti non definiti.
La memoria gestita manualmente può essere non tipizzata o associata a un tipo specifico. Si utilizza il tipo UnsafeMutablePointer per accedere e gestire la memoria che è stata associata a un tipo specifico. ( Fonte )
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)
Convertito a Swift 3.0 dalla fonte originale
Caso di utilizzo pratico per puntatori di buffer
Decostruire l'uso di un puntatore non sicuro nel metodo della libreria Swift;
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
Scopo:
Crea una nuova stringa copiando e convalidando i dati UTF-8 con terminazione nullo a cui fa riferimento il puntatore specificato.
Questo inizializzatore non tenta di riparare sequenze di unità di codice UTF-8 mal formate. Se ne viene trovato uno, il risultato dell'inizializzatore è nil
. L'esempio seguente chiama questo inizializzatore con puntatori al contenuto di due diversi array CChar
--- il primo con sequenze di unità di codice UTF-8 ben formate e il secondo con una sequenza malformata alla fine.
Source , Apple Inc., file di intestazione Swift 3 (per l'accesso all'intestazione: In Playground, Cmd + Fare clic sulla parola Swift) nella riga di codice:
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"
(Fonte, Apple Inc., Esempio di file Swift Header)