2016-07-01 9 views
6

स्विफ्ट में "CFRetain (sampleBuffer)" और "CFRelease (sampleBuffer)" का उपयोग कैसे करें? enter image description here CFRetain is unavailable: Core Foundation objectes are automatically memory managed.स्विफ्ट में "CFRetain (sampleBuffer)" का उपयोग कैसे करें?

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 

    [self appendVideoSampleBuffer:sampleBuffer]; 

} 

- (void)appendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer 
{ 
    dispatch_async(_writingQueue, ^{ 

     CFRetain(sampleBuffer); 
     [_videoInput appendSampleBuffer:sampleBuffer]; 
     CFRelease(sampleBuffer); 

    }); 
} 

आप इस विधि के दायरे से बाहर CMSampleBuffer वस्तु को संदर्भित करने की जरूरत है, तो आप इसे CFRetain और फिर इसे CFRelease जब आप इसे के साथ समाप्त कर करना होगा। (Apple Document)

+0

क्या आप _need_ को "इस विधि के दायरे से बाहर CMSampleBuffer ऑब्जेक्ट का संदर्भ देते हैं"? –

+0

हां, मैं '_writingQueue' में 'संलग्न नमूना बफर' करना चाहता हूं। – Limon

+0

'appendSampleBuffer:' बफर के साथ क्या करता है? क्या यह अपनी सामग्री को किसी अन्य स्मृति में कॉपी करता है, या इसका उपयोग करता है? पहले मामले में, मुझे लगता है कि आपकी रखरखाव/रिलीज जोड़ी आवश्यक नहीं होनी चाहिए। –

उत्तर

1

Apple Doc

मेमोरी प्रबंधित वस्तुओं

कोर फाउंडेशन एनोटेट एपीआई से लौटे वस्तुओं के अनुसार स्वचालित रूप से कर रहे हैं स्मृति में कामयाब स्विफ्ट-आप को लागू करने की जरूरत नहीं है CFRetain, CFRelease, या CFAutorelease स्वयं कार्य करता है।

तो आप वापस कोर फाउंडेशन अपनी खुद की सी कार्य करता है और ऑब्जेक्टिव-सी तरीकों से वस्तुओं, आप या तो CF_RETURNS_RETAINED या CF_RETURNS_NOT_RETAINED मैक्रो के लिए स्वचालित रूप डालने स्मृति प्रबंधन कॉल के साथ उन्हें टिप्पणी कर सकते हैं। आप CF_IMPLICIT_BRIDGING_ENABLED और CF_IMPLICIT_BRIDGING_DISABLED मैक्रोज़ का उपयोग कर सकते हैं ताकि कोर फाउंडेशन स्वामित्व नीति नामकरण नीति का पालन करने के लिए नाम प्रबंधन से का अनुमान लगाया जा सके।

यदि आप केवल एनोटेटेड एपीआई का उपयोग करते हैं जो अप्रत्यक्ष रूप से कोर फाउंडेशन ऑब्जेक्ट्स को वापस नहीं करते हैं, तो आप इस शेष अनुभाग को छोड़ सकते हैं। अन्यथा, अप्रबंधित कोर फाउंडेशन ऑब्जेक्ट्स के साथ काम करने के बारे में जानने के लिए जारी है।

0

आपको मैन्युअल रूप से रिलीज़ करने के लिए केवल sampleBuffer = nil की आवश्यकता है। लेकिन इसे CMSampleBufferCreateCopy(kCFAllocatorDefault, sampleBuffer, &newBuffer) का उपयोग करने से पहले सूचक की प्रतिलिपि बनाने की अनुशंसा की जाती है। इस मामले में नए sampleBuffer की प्रतिलिपि बनाने से पहले newBuffer को शून्य पर सेट करें।

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