我有点困惑。什么时候我必须免费拨打电话和/ dealloc?我正在研究一个学习核心音频的简短代码片段。我想如果我拨打UnsafeMutablePointer<Type>.alloc(size)
,那么我应该致电destroy
&amp; dealloc
。
但是,如果我使用malloc()
或calloc()
,我应该致电free()
。
在这个来自Learning Core Audio的示例中,以下代码片段让我想知道:
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))
我希望遵守规则。
我会感激任何帮助,因为这让我头晕目眩。文档说我负责销毁和dealloc,以便部分清楚,但以哪种方式?
答案 0 :(得分:1)
请参阅UnsafeMutablePointer Structure Reference。
指针可以处于以下状态之一:
未分配内存(例如,指针为空,或先前已释放内存)。
已分配内存,但尚未初始化值。
分配内存并初始化值。
当分配和初始化&#34;时,您可以安全地使用指向的区域。
因此,如果您想正确使用Swift UnsafeMutablePointer
,则在使用前需要2个步骤,使用后需要2个步骤。
(1)分配:alloc(_:)
。
(2)启动:initialize...()
您可以在此安全地使用已分配和初始化的区域。
(3)取消初始化:destroy(_:)
(4)解除分配:dealloc(_:)
为什么您可以将free()
用于alloc(_:)
内存,因为Swift在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)
(我认为即使使用elementCount
,我也应该使用此UnsafeMutablePointer
。alloc(_:)
或dealloc(_:)
使用&#34;元素数量&#34;,而不是&# 34;字节大小&#34;。)