Recherche…


Introduction

“Un pointeur de tampon est utilisé pour un accès de bas niveau à une région de la mémoire. Par exemple, vous pouvez utiliser un pointeur de tampon pour un traitement et une communication efficaces des données entre les applications et les services.

Extrait de: Apple Inc. «Utilisation de Swift avec Cocoa et Objective-C (édition Swift 3.1)». IBooks. https://itun.es/us/utTW7.l

Vous êtes responsable de la gestion du cycle de vie de toute mémoire avec laquelle vous travaillez via des pointeurs de tampons, pour éviter les fuites ou un comportement indéfini.

Remarques

Concepts étroitement alignés requis pour compléter sa compréhension des BufferPointers (Unsafe).

  • MemoryLayout ( Disposition de la mémoire d'un type, décrivant sa taille, sa foulée et son alignement .)
  • Unmanaged ( Type pour la propagation d'une référence d'objet non gérée )
  • UnsafeBufferPointer ( Une interface de collection non propriétaire à un tampon d'éléments stockés de manière contiguë dans la mémoire ).
  • UnsafeBufferPointerIterator ( itérateur pour les éléments du tampon référencé par une occurrence UnsafeBufferPointer ou UnsafeMutableBufferPointer )
  • UnsafeMutableBufferPointer ( Une interface de collection non propriétaire à une mémoire tampon d'éléments mutables stockés de manière contiguë dans la mémoire ) .
  • UnsafeMutablePointer ( Un pointeur pour accéder et manipuler des données d'un type spécifique ) .
  • UnsafeMutableRawBufferPointer ( interface de collecte sans correspondance mutable aux octets dans une région de la mémoire. )
  • UnsafeMutableRawBufferPointer.Iterator ( Un itérateur sur les octets affichés par un pointeur de tampon brut. )
  • UnsafeMutableRawPointer ( Un pointeur brut pour accéder et manipuler des données non typées. )
  • UnsafePointer ( Un pointeur pour accéder aux données d'un type spécifique )
  • UnsafeRawBufferPointer ( Une interface de collecte non propriétaire aux octets dans une région de la mémoire. )
  • UnsafeRawBufferPointer.Iterator ( Un itérateur sur les octets affichés par un pointeur de tampon brut. )
  • UnsafeRawPointer ( Un pointeur brut pour accéder aux données non typées. )

(Source, Swiftdoc.org )

UnsafeMutablePointer

struct UnsafeMutablePointer<Pointee>

Un pointeur pour accéder et manipuler des données d'un type spécifique.

Vous utilisez des instances du type UnsafeMutablePointer pour accéder aux données d'un type spécifique en mémoire. Le type de données auquel un pointeur peut accéder est le type Pointee du pointeur. UnsafeMutablePointer ne fournit aucune garantie de gestion de mémoire ou d'alignement automatique. Vous êtes responsable de la gestion du cycle de vie de toute mémoire avec laquelle vous travaillez via des pointeurs non sécurisés pour éviter les fuites ou un comportement indéfini.

La mémoire que vous gérez manuellement peut être non typée ou liée à un type spécifique. Vous utilisez le type UnsafeMutablePointer pour accéder et gérer la mémoire qui a été liée à un type spécifique. ( Source )

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)

Converti à Swift 3.0 à partir de la source d' origine

Cas pratique d'utilisation des tampons

Déconstruire l'utilisation d'un pointeur non sécurisé dans la méthode de bibliothèque Swift;

public init?(validatingUTF8 cString: UnsafePointer<CChar>)

Objectif:

Crée une nouvelle chaîne en copiant et en validant les données UTF-8 à terminaison nulle référencées par le pointeur donné.

Cet initialiseur ne tente pas de réparer les séquences d'unité de code UTF-8 mal formées. S'il en existe, le résultat de l'initialiseur est nil . L'exemple suivant appelle cet initialiseur avec des pointeurs vers le contenu de deux baies CChar différentes CChar la première avec des séquences d'unités de code UTF-8 bien formées et la seconde avec une séquence mal formée à la fin.

Source , Apple Inc., fichier d'en-tête Swift 3 (Pour l'accès en-tête: In Playground, Cmd + Clic sur le mot Swift) dans la ligne de code:

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., Exemple de fichier Swift Header)



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow