Swift Language
(Unsichere) Pufferzeiger
Suche…
Einführung
„Ein Pufferzeiger wird für den Low-Level-Zugriff auf einen Speicherbereich verwendet. Sie können beispielsweise einen Pufferzeiger für die effiziente Verarbeitung und Kommunikation von Daten zwischen Apps und Diensten verwenden. “
Auszug aus: Apple Inc. „Swift mit Cocoa und Objective-C (Swift 3.1 Edition) verwenden.“ IBooks. https://itun.es/us/utTW7.l
Sie sind für die Handhabung des Lebenszyklus aller Speicher, mit denen Sie arbeiten, durch Pufferzeiger verantwortlich, um Lecks oder undefiniertes Verhalten zu vermeiden.
Bemerkungen
Genau aufeinander abgestimmte Konzepte, die erforderlich sind , um das Verständnis von (unsicheren) Pufferpunkten zu vervollständigen.
- MemoryLayout ( Das Speicherlayout eines Typs, das Größe, Schritt und Ausrichtung beschreibt .)
- Nicht verwaltet ( Ein Typ für die Weitergabe einer Referenz eines nicht verwalteten Objekts .)
- UnsafeBufferPointer ( Eine nicht besitzende Erfassungsschnittstelle für einen Puffer von Elementen, die zusammenhängend im Speicher gespeichert sind .)
- UnsafeBufferPointerIterator ( Ein Iterator für die Elemente im Puffer, auf die von einer UnsafeBufferPointer- oder UnsafeMutableBufferPointer-Instanz verwiesen wird .)
- UnsafeMutableBufferPointer ( Eine nicht besitzende Erfassungsschnittstelle für einen Puffer von veränderlichen Elementen, die zusammenhängend im Speicher gespeichert sind. )
- UnsafeMutablePointer ( Ein Zeiger für den Zugriff auf und das Bearbeiten von Daten eines bestimmten Typs. )
- UnsafeMutableRawBufferPointer ( Eine veränderliche nicht vorhandene Auflistungsschnittstelle für die Bytes in einem Speicherbereich. )
- UnsafeMutableRawBufferPointer.Iterator ( Ein Iterator über den Bytes, die von einem Rohpufferzeiger angezeigt werden.
- UnsafeMutableRawPointer ( Ein Rohzeiger für den Zugriff auf und die Bearbeitung nicht typisierter Daten. )
- UnsafePointer ( Ein Zeiger für den Zugriff auf Daten eines bestimmten Typs. )
- UnsafeRawBufferPointer ( Eine nicht vorhandene Auflistungsschnittstelle für die Bytes in einem Speicherbereich. )
- UnsafeRawBufferPointer.Iterator ( Ein Iterator über den Bytes, die von einem rohen Pufferzeiger angezeigt werden.
- UnsafeRawPointer ( Ein Rohzeiger für den Zugriff auf nicht typisierte Daten. )
(Quelle, Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
Ein Zeiger für den Zugriff und die Bearbeitung von Daten eines bestimmten Typs.
Sie verwenden Instanzen des Typs UnsafeMutablePointer, um auf Daten eines bestimmten Typs im Speicher zuzugreifen. Der Datentyp, auf den ein Zeiger zugreifen kann, ist der Pointee-Typ des Zeigers. UnsafeMutablePointer bietet keine automatisierte Speicherverwaltung oder Ausrichtungsgarantie. Sie sind dafür verantwortlich, den Lebenszyklus eines Speichers, mit dem Sie arbeiten, durch unsichere Zeiger zu behandeln, um Lecks oder undefiniertes Verhalten zu vermeiden.
Speicher, den Sie manuell verwalten, kann entweder nicht typisiert oder an einen bestimmten Typ gebunden sein. Sie verwenden den Typ UnsafeMutablePointer, um auf Speicher zuzugreifen und diesen zu verwalten, der an einen bestimmten Typ gebunden wurde. ( Quelle )
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)
Umgewandelt in Swift 3.0 von der ursprünglichen Quelle
Praktischer Anwendungsfall für Pufferzeiger
Dekonstruieren der Verwendung eines unsicheren Zeigers in der Swift-Bibliotheksmethode;
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
Zweck:
Erstellt eine neue Zeichenfolge durch Kopieren und Validieren der nullterminierten UTF-8-Daten, auf die der angegebene Zeiger verweist.
Dieser Initialisierer versucht nicht, falsch geformte UTF-8-Code-Unit-Sequenzen zu reparieren. Wenn irgendwelche gefunden werden, ist das Ergebnis des Initialisierers gleich nil
. Im folgenden Beispiel wird dieser Initialisierer mit Zeigern auf den Inhalt von zwei verschiedenen CChar
Arrays CChar
- der erste mit wohlgeformten UTF-8- CChar
und der zweite mit einer schlecht geformten Sequenz am Ende.
Source , Apple Inc., Swift 3-Headerdatei (Für Headerzugriff: In Playground, Cmd + Klicken Sie auf das Wort Swift) in der Codezeile:
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"
(Quelle, Apple Inc., Swift Header File Beispiel)