如何正确处理UnsafeMutablePointer
我有点困惑。 什么时候我必须免费拨打电话和/ devalloc? 我正在研究一个学习核心音频的简短代码片段。 我想如果我调用UnsafeMutablePointer.alloc(size)
那么我应该调用destroy
& dealloc
。 但是如果我使用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(_:)
使用“元素数”,而不是“字节大小”。)