2016-07-04 21 views
6

少し混乱します。いつ私は無料で電話しなければならないのですか?私は、コアオーディオを学習する短いコードスニペットに取り組んでいます。 UnsafeMutablePointer<Type>.alloc(size)と呼ぶと、私は電話しなければならないと思った。destroy & dealloc。 しかし、malloc()またはcalloc()を使用すると、私はfree()と呼ぶことになっています。ここでUnsafeMutablePointerを正しく処理する方法

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

私はallocを使用します。この例では

学習のCore Audioから次のコードスニペットは、私を不思議になります。メモリを解放するにはfreeが呼び出されます。

free(asbds) 

しかし、私はルールを次のよう期待する理由はない

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

これは私の頭を回転させるので、私はどんな助けもありがとう。ドキュメンテーションには、私は破壊と破壊の責任を負っていると言われているので、その部分ははっきりしていますが、それはどのような意味ですか?

答えて

1

UnsafeMutablePointer Structure Referenceを参照してください。

ポインタは、次のいずれかの状態にあることができる:

  • メモリが割り当てられていない(例えば、ポインタがヌルである、またはメモリは、以前に割り当て解除されています)。

  • メモリは割り当てられていますが、値は初期化されていません。

  • メモリが割り当てられ、値が初期化されます。

「に割り当てられ、初期化」するときは、安全に尖った部位を使用することができます。 SwiftのUnsafeMutablePointerを正しく使用するには、使用する前に2ステップ、使用後に2ステップが必要です。 (1)割り当て:alloc(_:)

(2)Initilize:あなたが安全に、ここで割り当てられ、初期化部位を使用することができますinitialize...()

(3)Deinitialize:destroy(_:)

(4)割り当て解除:dealloc(_:)


そして、なぜあなたはスウィフトは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(_:)は「要素数」ではなく、「バイトサイズ」を使用しています。。)

+0

ありがとうございます。それはたくさんの助けになりました。私は配列のアプローチが本当に好きです。それは物事をより迅速にします。 しかし、私のために 'free()'部分をクリアするには。今は 'free'や' destroy'と 'dealloc'を呼び出すのに違いはありませんか?私はそれが正しいことを理解しましたか? 'alloc'はカーテンの後ろで' malloc'を呼び出しているからです。 – enovatia

関連する問題