iOS 12.x swift 5
我正在使用套接字与另一个盒子通信,我编写了这段我认为有意义的代码。但我想咨询专家。我问是因为我认为这个应用程序存在某种内存泄漏。我和你一样怀疑指针。我正在观察它使用的内存在我运行时缓慢增加。
func sendMessage(message: String) {
let data = message.data(using: String.Encoding.utf8, allowLossyConversion: false)!
let dataMutablePointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)
//Copies the bytes to the Mutable Pointer
dataMutablePointer.initialize(to: 0)
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.deinitialize(count: data.count)
}
}
这段代码看起来合理吗?这可能是我内存泄漏的根源吗?我需要去初始化这个指针吗?
最佳答案
这可能是我内存泄漏的根源吗?
当然可以。
我需要去初始化这个指针吗?
正如 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
将其 block 的执行推迟到封闭 block 的末尾,因此 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)
}
关于ios - 内存泄漏,我的问题可能是指针 [swift],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56193028/