我需要释放UnsafeBufferPointer还是在缓冲指针起始内存位置使用的UnsafePointer?

3
考虑这个关于NSData的扩展,它将NSData对象序列化为一个十六进制字符串:(链接)
extension NSData {
    func base16EncodedString(uppercase uppercase: Bool = false) -> String {
        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count: self.length)
        let hexFormat = uppercase ? "X" : "x"
        let formatString = "%02\(hexFormat)"
        let bytesAsHexStrings = buffer.map {
            String(format: formatString, $0)
        }
        return bytesAsHexStrings.joinWithSeparator("")
    }
}

如果一个 UnsafeBufferPointer 是一个非拥有指针,那么这是否意味着我不需要(或无法)显式调用 destroy? 如果我从 NSData 对象的字节内存中创建一个 UnsafePointer,在缓冲区被复制后,我是否需要确保销毁该指针?


与https://dev59.com/dF8e5IYBdhLWcg3wlbFR进行比较:“destroy()仅在指针所引用的内存中有非平凡内容时才是必要的,例如强引用或Swift结构体或枚举。” - 在这种意义上,UInt8是“平凡内容”,无论您是否调用destroy都无关紧要。 - Martin R
@MartinR 谢谢。所以 UnsafePointer(self.bytes) 不会泄漏,因为一旦它超出作用域,它就会被释放? - JAL
3
UnsafePointer(self.bytes)仅是从UnsafePointer<Void>UnsafePointer<UInt8>的指针转换("cast")操作,它不会分配内存。这块内存由NSData对象管理。 - Martin R
@MartinR 当然,因为我们没有调用alloc。谢谢。如果您将此作为答案添加,我会接受它。 - JAL
1个回答

5

UnsafePointer(self.bytes)只是从UnsafePointer<Void>转换为UnsafePointer<UInt8>的指针转换(类似于C中的“强制类型转换”)。它不会分配内存。

内存由NSData对象管理。您没有调用alloc()分配内存,因此不能在指针上调用dealloc()。您也没有初始化内存,因此不能destroy()它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接