Поиск…


Вступление

«Буферный указатель используется для низкоуровневого доступа к области памяти. Например, вы можете использовать указатель буфера для эффективной обработки и передачи данных между приложениями и службами ».

Выдержка из: 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)



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow