【发布时间】:2019-10-05 04:14:11
【问题描述】:
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)
}
}
这段代码看起来正常吗?这可能是我的内存泄漏的根源吗?我需要取消初始化这个指针吗?
【问题讨论】:
-
您可能需要在完成后显式调用
deallocate来删除您的指针以避免内存问题。看起来您正在使用deinitialize。 developer.apple.com/documentation/swift/unsafepointer/… -
我可以在 defer 语句中取消分配吗?显然我不希望它在流完成之前取消分配内存。
-
我不是确定的。但我认为你可以在
dataPointer或dataMutablePointer范围内的任何地方调用它。 -
您可以使用
defer { dataMutablePointer.deallocate() },只要您希望在您离开范围时总是发生解除分配。此外,您只需要在非平凡类型上调用deinitialize(count:),因此您可以根据需要在此上下文中删除该调用。