Насколько безопасен UnsafeMutableRawPointer (переменная) - PullRequest
0 голосов
/ 11 октября 2018

Если я хочу получить unsafemutablerawpointer переменной.Но без создания копий или буфера, какой лучший / эффективный способ сделать это?

Приведенный ниже пример работает!

var number:UInt = 5

let numberPointer = UnsafeMutableRawPointer(&number)

var pointer:UnsafeMutablePointer<UInt8> = numberPointer.bindMemory(to: UInt8.self, capacity: size)

pointer[0] = 88

print(numberPointer) // 88 

Еще из документов Apple:

* 1009 Docs *

1 Ответ

0 голосов
/ 11 октября 2018

Это не безопасно, как в документе Apple или как в моем комментарии.

Если вы хотите сделать это каким-то безопасным способом, вам может понадобиться написать что-то вроде этого:

var number: UInt = 5

let size = MemoryLayout.size(ofValue: number)
withUnsafeMutableBytes(of: &number) {numberUmbp in
    let numberPointer = numberUmbp.baseAddress!
    let pointer: UnsafeMutablePointer<UInt8> = numberPointer.bindMemory(to: UInt8.self, capacity: size)

    pointer[0] = 88
} //`pointer` (or `numberPointer`) is guaranteed to be valid only inside this closure

print(number) // 88

Конечно, указатель pointer действителен только внутри замыкания.

Если вы хотите извлечь более стабильный и постоянный адрес, вы не можете избежать создания копий или буфера втекущая спецификация Swift.

...