代码之家  ›  专栏  ›  技术社区  ›  user3069232

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

  •  0
  • user3069232  · 技术社区  · 7 年前

    iOS 12。x斯威夫特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)
        }
    }
    

    这个代码看起来正常吗?这可能是我内存泄漏的原因吗?我需要去硝化这个指针吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   OOPer    7 年前

    这可能是我内存泄漏的原因吗?

    当然可以。

    我需要去硝化这个指针吗?

    正如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)
    }