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)



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow