2016-07-04 16 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 का उपयोग करें। स्मृति को मुक्त करने के लिए free कहा जाता है।

free(asbds) 

लेकिन क्यों

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

नहीं जो मैं नियम का पालन उम्मीद करेंगे।

मैं किसी भी मदद की सराहना करता हूं, क्योंकि इससे मेरा सिर स्पिन बन जाता है। प्रलेखन का कहना है कि मैं नष्ट करने और नष्ट करने के लिए ज़िम्मेदार हूं ताकि हिस्सा स्पष्ट हो, लेकिन किस तरह से?

उत्तर

1

UnsafeMutablePointer Structure Reference देखें।

सूचक निम्न राज्यों में से एक में हो सकता है:

  • मेमोरी आवंटित नहीं किया गया है (उदाहरण के लिए, सूचक शून्य है, या स्मृति पहले से पुनः आवंटित की जाती किया गया है)।

  • मेमोरी आवंटित है, लेकिन मूल्य शुरू नहीं किया गया है।

  • मेमोरी आवंटित है और मूल्य प्रारंभ किया गया है।

आप सुरक्षित रूप से उठाई क्षेत्र का उपयोग कर सकते है जब "आवंटित और प्रारंभ"। तो, यदि आप स्विफ्ट के UnsafeMutablePointer का सही उपयोग करना चाहते हैं, तो आपको उपयोग करने से पहले 2 चरणों और उपयोग करने के बाद 2 चरणों की आवश्यकता है।

(1) आवंटित करें: alloc(_:)

(2) Initilize: initialize...()

आप सुरक्षित रूप से आवंटित और प्रारंभ क्षेत्र यहाँ का उपयोग कर सकते हैं।

(3) Deinitialize: destroy(_:)

(4) पुनःआवंटन: dealloc(_:)


और क्यों आप alloc(_:) एड स्मृति के लिए free() उपयोग कर सकते हैं, कि क्योंकि स्विफ्ट alloc(_:) की वर्तमान कार्यान्वयन में malloc(_:) का उपयोग करता है। इसलिए, मुफ्त साधनों का उपयोग करके आपका ऐप स्विफ्ट रनटाइम के वर्तमान कार्यान्वयन पर निर्भर करता है।


तो 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(_:) उपयोग करता है "तत्वों की संख्या", नहीं "बाइट आकार")

: आपके मामले में, आप कुछ इस तरह लिख सकते हैं
+0

आपको बहुत बहुत धन्यवाद। इससे बहुत मदद मिली। मुझे वास्तव में सरणी दृष्टिकोण पसंद है, जो चीजों को और अधिक तेज़ बनाता है। लेकिन मेरे लिए 'मुक्त()' भाग साफ़ करने के लिए। अभी 'मुक्त' नष्ट 'और 'dealloc' को कॉल करने में कोई अंतर नहीं है? क्या मैं सही समझ गया? क्योंकि 'alloc' पर्दे के पीछे 'malloc' को बुला रहा है। – enovatia

संबंधित मुद्दे