这可能是我内存泄漏的原因吗?
当然可以。
我需要去硝化这个指针吗?
正如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)
}