Swift Language
(Небезопасные) Буферные указатели
Поиск…
Вступление
«Буферный указатель используется для низкоуровневого доступа к области памяти. Например, вы можете использовать указатель буфера для эффективной обработки и передачи данных между приложениями и службами ».
Выдержка из: Apple Inc. «Использование Swift с Cocoa и Objective-C (Swift 3.1 Edition)». IBooks. https://itun.es/us/utTW7.l
Вы несете ответственность за обработку жизненного цикла любой памяти, с которой работаете, с помощью указателей буфера, чтобы избежать утечек или неопределенного поведения.
замечания
Тщательно выровненные концепции, необходимые для полного понимания (Unsafe) BufferPointers.
- MemoryLayout ( макет памяти типа, описывающий его размер, шаг и выравнивание ).
- Неуправляемый ( тип для распространения ссылки на неуправляемый объект ).
- UnsafeBufferPointer (Неприемлемый интерфейс коллекции для буфера элементов, хранящихся в памяти в памяти .)
- UnsafeBufferPointerIterator ( Итератор для элементов в буфере, на который ссылается экземпляр UnsafeBufferPointer или UnsafeMutableBufferPointer ).
- UnsafeMutableBufferPointer (Неприемлемый интерфейс коллекции для буфера изменяемых элементов, хранящихся в памяти в памяти ).
- UnsafeMutablePointer ( указатель для доступа и управления данными определенного типа ).
- UnsafeMutableRawBufferPointer ( изменяемый интерфейс сбора недействительных байтов в области памяти ).
- UnsafeMutableRawBufferPointer.Iterator ( Итератор по байтам, просмотренный указателем необработанного буфера ).
- UnsafeMutableRawPointer ( необработанный указатель для доступа и обработки нетипизированных данных ).
- UnsafePointer ( указатель для доступа к данным определенного типа ).
- UnsafeRawBufferPointer ( Недействующий интерфейс сбора байтов в области памяти. )
- UnsafeRawBufferPointer.Iterator ( Итератор по байтам, просматриваемый указателем необработанного буфера ).
- UnsafeRawPointer ( необработанный указатель для доступа к нетипизированным данным. )
(Источник, Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
Указатель для доступа и обработки данных определенного типа.
Вы используете экземпляры типа UnsafeMutablePointer для доступа к данным определенного типа в памяти. Тип данных, к которым может обращаться указатель, - тип Pointee указателя. UnsafeMutablePointer не обеспечивает автоматические функции управления памятью или выравнивания. Вы несете ответственность за обработку жизненного цикла любой памяти, с которой работаете, с помощью небезопасных указателей, чтобы избежать утечек или неопределенного поведения.
Память, которую вы вручную управляете, может быть либо непечатана, либо привязана к определенному типу. Тип UnsafeMutablePointer используется для доступа и управления памятью, привязанной к определенному типу. ( Источник )
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)
Преобразован в Swift 3.0 из исходного источника
Практический пример использования для буферов
Деконструирование использования небезопасного указателя в библиотечном методе Swift;
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
Цель:
Создает новую строку, копируя и проверяя данные UTF-8 с нулевым завершением, на которые ссылается данный указатель.
Этот инициализатор не пытается восстановить неправильно сформированные последовательности кода UTF-8. Если они найдены, результат инициализатора равен nil
. Следующий пример вызывает этот инициализатор с указателями на содержимое двух разных массивов CChar
- первый с хорошо сформированными последовательностями кода кода UTF-8, а второй с плохо сформированной последовательностью в конце.
Source , Apple Inc., файл заголовка Swift 3 (для доступа к заголовку: на игровой площадке, Cmd + щелкните по слову Swift) в строке кода:
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"
(Источник, Apple Inc., пример файла Swift Header)