如何正确处理 UnsafeMutablePointer

Posted

技术标签:

【中文标题】如何正确处理 UnsafeMutablePointer【英文标题】:How to handle UnsafeMutablePointer correctly 【发布时间】:2016-07-04 01:35:47 【问题描述】:

我有点困惑。我什么时候必须调用 free 以及何时销毁/dealloc?我正在编写一个短代码 sn-p 学习核心音频。我想如果我打电话给UnsafeMutablePointer<Type>.alloc(size),那么我应该打电话给destroydealloc。 但如果我使用malloc()calloc() 我应该打电话给free()

在学习核心音频的这个例子中,下面的代码 sn-p 让我想知道:

var asbds = UnsafeMutablePointer<AudiostreamBasicDescription>.alloc(Int(infoSize))
audioErr = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat,
                              UInt32(sizeof(fileTypeAndFormat.dynamicType)), &fileTypeAndFormat,
                              &infoSize, asbds)

这里我使用alloc。调用free释放内存。

free(asbds)

但为什么不

asbds.destroy(Int(infoSize))
asbds.dealloc(Int(infoSize))

我希望遵守规则。

我会很感激任何帮助,因为这让我头晕目眩。文档说我负责销毁和解除分配,以便清楚地知道这部分,但是以哪种方式?

【问题讨论】:

【参考方案1】:

请参阅UnsafeMutablePointer Structure Reference。

指针可以处于以下状态之一:

内存未分配(例如,指针为空,或者内存之前已被释放)。

内存已分配,但值尚未初始化。

分配内存并初始化值。

您可以在“分配和初始化”时安全地使用指向区域。 所以,如果你想正确使用Swift的UnsafeMutablePointer,你需要在使用前2步,使用后2步。

(1) 分配:alloc(_:).

(2) 初始化:initialize...()

您可以在这里安全地使用分配和初始化的区域。

(3) 取消初始化:destroy(_:)

(4) 解除分配:dealloc(_:)


以及为什么你可以将free() 用于alloc(_:)ed 内存,那是因为Swift 在alloc(_:) 的当前实现中使用了malloc(_:)。因此,使用 free 意味着您的应用依赖于 Swift 运行时的当前实现。


所以,使用UnsafeMutablePointer 有点困难和烦人。您应该考虑将数组作为指针传递。 在你的情况下,你可以这样写:

    let elementCount = Int(infoSize) / strideof(AudioStreamBasicDescription)
    var asbds: [AudioStreamBasicDescription] = Array(count: elementCount, repeatedValue: AudioStreamBasicDescription())
    audioErr = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat,
                                  UInt32(sizeof(fileTypeAndFormat.dynamicType)), &fileTypeAndFormat,
                                  &infoSize, &asbds)

(我认为即使使用UnsafeMutablePointer,你也应该使用这个elementCountalloc(_:)dealloc(_:) 使用“元素数量”,而不是“字节大小”。)

【讨论】:

非常感谢。这有很大帮助。我真的很喜欢数组方法,它让事情变得更加快捷。但是要为我清除free()part。现在打电话freedestroydealloc没有区别?我理解正确吗?因为alloc 在幕后打电话给malloc

以上是关于如何正确处理 UnsafeMutablePointer的主要内容,如果未能解决你的问题,请参考以下文章

如何正确处理 JWT 刷新?

如何正确处理 typescript 中的 promisifyAll?

如何正确处理服务器端错误?

如何正确处理位置服务切换

如何正确处理 UnsafeMutablePointer

xstate - 如何正确处理转换错误?