如何正确处理UnsafeMutablePointer

我有点困惑。 什么时候我必须免费拨打电话和/ devalloc? 我正在研究一个学习核心音频的简短代码片段。 我想如果我调用UnsafeMutablePointer.alloc(size)那么我应该调用destroydealloc 。 但是如果我使用malloc()calloc()我应该调用free()

在这个来自Learning Core Audio的示例中,以下代码片段让我想知道:

 var asbds = UnsafeMutablePointer.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)) 

我希望遵循规则。

我会感激任何帮助,因为这让我头晕目眩。 文档说我负责销毁和dealloc,以便部分清晰,但是以哪种方式?

请参阅UnsafeMutablePointer结构参考 。

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

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

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

  • 分配内存并初始化值。

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

(1)分配: alloc(_:)

(2) initialize...()initialize...()

您可以在此处安全地使用已分配和已初始化的区域。

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

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


为什么你可以使用free()来获取alloc(_:) ed内存,这是因为Swift在alloc(_:)的当前实现中使用了malloc(_:) alloc(_:) 。 因此,使用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也应该使用此elementCount alloc(_:)dealloc(_:)使用“元素数”,而不是“字节大小”。)