Swift Language
(Inseguro) punteros de búfer
Buscar..
Introducción
“Se utiliza un puntero de búfer para el acceso de bajo nivel a una región de memoria. Por ejemplo, puede usar un puntero de búfer para el procesamiento y la comunicación eficientes de datos entre aplicaciones y servicios ".
Extracto de: Apple Inc. "Uso de Swift con Cocoa y Objective-C (Edición Swift 3.1)". IBooks. https://itun.es/us/utTW7.l
Usted es responsable de manejar el ciclo de vida de cualquier memoria con la que trabaje a través de punteros de búfer, para evitar fugas o comportamientos indefinidos.
Observaciones
Conceptos estrechamente alineados requeridos para completar la comprensión de los BufferPointers (inseguros).
- MemoryLayout ( el diseño de memoria de un tipo, que describe su tamaño, zancada y alineación ).
- No administrado ( un tipo para propagar una referencia de objeto no administrado ).
- UnsafeBufferPointer ( Una interfaz de colección no propietaria a un búfer de elementos almacenados de forma contigua en la memoria ).
- UnsafeBufferPointerIterator ( un iterador para los elementos en el búfer al que hace referencia una instancia de UnsafeBufferPointer o UnsafeMutableBufferPointer ).
- UnsafeMutableBufferPointer ( Una interfaz de colección no propietaria a un búfer de elementos mutables almacenados de forma contigua en la memoria ) .
- UnsafeMutablePointer ( Un puntero para acceder y manipular datos de un tipo específico ) .
- UnsafeMutableRawBufferPointer ( Una interfaz de colección no propietaria mutable a los bytes en una región de memoria ) .
- UnsafeMutableRawBufferPointer.Iterator ( un iterador sobre los bytes vistos por un puntero de búfer en bruto ) .
- UnsafeMutableRawPointer ( Un puntero en bruto para acceder y manipular datos sin tipo ) .
- UnsafePointer ( Un puntero para acceder a datos de un tipo específico ) .
- UnsafeRawBufferPointer ( Una interfaz de colección no propia para los bytes en una región de memoria ) .
- UnsafeRawBufferPointer.Iterator ( un iterador sobre los bytes vistos por un puntero de búfer en bruto ) .
- UnsafeRawPointer ( Un puntero en bruto para acceder a datos sin tipo ) .
(Fuente, Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
Un puntero para acceder y manipular datos de un tipo específico.
Utiliza instancias del tipo UnsafeMutablePointer para acceder a datos de un tipo específico en la memoria. El tipo de datos al que puede acceder un puntero es el tipo Pointee del puntero. UnsafeMutablePointer no ofrece gestión automatizada de la memoria ni garantías de alineación. Usted es responsable de manejar el ciclo de vida de cualquier memoria con la que trabaje mediante punteros inseguros para evitar fugas o comportamientos indefinidos.
La memoria que administras manualmente se puede desincronizar o enlazar a un tipo específico. Utiliza el tipo UnsafeMutablePointer para acceder y administrar la memoria que se ha vinculado a un tipo específico. ( Fuente )
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)
Convertido a Swift 3.0 desde la fuente original
Práctico caso de uso para punteros de búfer
Deconstruir el uso de un puntero no seguro en el método de la biblioteca Swift;
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
Propósito:
Crea una nueva cadena copiando y validando los datos UTF-8 terminados en nulo a los que hace referencia el puntero dado.
Este inicializador no intenta reparar secuencias de unidades de código UTF-8 mal formadas. Si se encuentra alguno, el resultado del inicializador es nil
. El siguiente ejemplo llama a este inicializador con punteros al contenido de dos matrices CChar
diferentes CChar
el primero con secuencias de unidades de código UTF-8 bien formadas y el segundo con una secuencia mal formada al final.
Fuente , Apple Inc., archivo de encabezado Swift 3 (Para acceder al encabezado: en Playground, Cmd + Haga clic en la palabra Swift) en la línea de código:
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"
(Fuente, Apple Inc., Swift Header File Example)