我有点困惑。什么时候我必须拨打免费电话,什么时候销毁/取消分配电话?我正在研究一个简短的代码片段,以学习核心音频。我以为如果我调用UnsafeMutablePointer<Type>.alloc(size)
,那么我应该调用destroy
和dealloc
。
但是,如果我使用malloc()
或calloc()
,我应该叫free()
。
在来自“学习核心音频”的此示例中,以下代码片段使我感到奇怪:
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))
我希望遵循规则。
我将不胜感激,因为这会使我转头。文档说我负责销毁和释放,以便使这一部分清晰可见,但是用哪种方式呢?
最佳答案
参见UnsafeMutablePointer Structure Reference。
当“分配和初始化”时,可以安全地使用指向的区域。
因此,如果您想正确使用Swift的UnsafeMutablePointer
,在使用之前需要2个步骤,在使用之后需要2个步骤。
(1)分配:alloc(_:)
。
(2)初始化:initialize...()
您可以在此处安全地使用分配和初始化的区域。
(3)取消初始化:destroy(_:)
(4)解除分配:dealloc(_:)
以及为什么可以将free()
用于alloc(_:)
ed内存,这是因为Swift在当前malloc(_:)
的实现中使用alloc(_:)
。因此,使用免费意味着您的应用程序依赖于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(_:)
使用“元素数”,而不是“字节大小”。)关于c - 如何正确处理UnsafeMutablePointer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38175870/