Может ли это быть причиной утечки моей памяти?
Да, конечно.
Нужно ли деинитализировать этот указатель?
Как прокомментировал bscothern, вам нужно деинитализировать указатель, если Pointee
нетривиального типа. Но в случае UInt8
это не обязательно.
Но вам необходимо в конце концов освободить указатель .
Ваш код будет выглядеть примерно так:
func sendMessage(message: String) {
let data = message.data(using: String.Encoding.utf8, allowLossyConversion: false)!
let dataMutablePointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)
defer {
dataMutablePointer.deallocate()
}
//Copies the bytes to the Mutable Pointer
dataMutablePointer.initialize(to: 0)
defer {
//This is not required, but you can put `deinitialize` here if you prefer
dataMutablePointer.deinitialize(count: data.count)
}
data.copyBytes(to: dataMutablePointer, count: data.count)
//Cast to regular UnsafePointer
let dataPointer = UnsafePointer<UInt8>(dataMutablePointer)
//Your stream
outputStream.write(dataPointer, maxLength: data.count)
}
defer
откладывает выполнение своего блока до конца окружающего блока, поэтому dataMutablePointer.deallocate()
будет выполнено после завершения outputStream.write(dataPointer, maxLength: data.count)
.
Но я бы написал что-то эквивалентное без копирования данных:
func sendMessage(message: String) {
let data = message.data(using: String.Encoding.utf8, allowLossyConversion: false)!
data.withUnsafeBytes {bytes in
let dataPointer = bytes.baseAddress!.assumingMemoryBound(to: UInt8.self)
//Your stream
outputStream.write(dataPointer, maxLength: data.count)
}
}
Или, проще:
func sendMessage(message: String) {
//Your stream
outputStream.write(message, maxLength: message.utf8.count)
}