ios - 内存泄漏,我的问题可能是指针 [swift]

标签 ios swift pointers stream

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/

相关文章:

ios - 在 IOS 上绘制颜色网格的最快方法是什么?

ios - 当导航栏隐藏时,如何保持网页标题可见,就像在 iOS Safari 中一样?

ios - 无法加载资源: unsupported url

json - 在 iOS 7 下尝试使用 SwiftyJSON 解析 JSON 数据时出现未知类型

swift - SpriteKit : Move Whole Scene

父/子类的 C++ 复制构造函数问题

objective-c - "detailItem"和 "_detailitem"之间的区别

ios - 为什么我的 BottomText 边框没有禁用,但 topText 可以正常工作?

c++ - 如何将模板变量更改为特定类型或不让它成为空指针

pointers - 如何在 Golang 中动态取消引用指针