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)



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow