मेरे पास एक ऐसा फ़ंक्शन है जो कुछ बिटमैप डेटा लेता है और इससे UIImage * लौटाता है। ऐसा कुछ ऐसा दिखता है:बफर-> CGImageRef-> UIImage के लिए सही मेमोरी प्रबंधन पैटर्न क्या है?
UIImage * makeAnImage()
{
unsigned char * pixels = malloc(...);
// ...
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, pixelBufferSize, NULL);
CGImageRef imageRef = CGImageCreate(..., provider, ...);
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
return [image autorelease];
}
क्या कोई यह बता सकता है कि यहां कौन सी मेमोरी है? मैं ठीक से साफ करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि इसे सुरक्षित तरीके से कैसे किया जाए। डॉक्स इन पर अस्पष्ट हैं। यदि UIImage बनाने के बाद इस फ़ंक्शन के अंत में free
पिक्सेल, और फिर UIImage का उपयोग करें, तो मैं क्रैश करता हूं। यदि मैं UIImage बनाने के बाद प्रदाता या छवि रिफ को रिलीज़ करता हूं, तो मुझे कोई क्रैश दिखाई नहीं देता है, लेकिन वे स्पष्ट रूप से पिक्सल को सभी तरह से गुजर रहे हैं, इसलिए मैं इन मध्यवर्ती राज्यों को जारी करने के बारे में सोच रहा हूं।
(मुझे प्रति सीएफ डॉक्स पता है कि मुझे बाद में दोनों को रिलीज करने की आवश्यकता होनी चाहिए क्योंकि वे फ़ंक्शन बनाने से आते हैं, लेकिन क्या मैं यूआईएममेज का उपयोग करने से पहले ऐसा कर सकता हूं?) संभवतः मैं प्रदाता के डेलोक कॉलबैक का उपयोग कर सकता हूं पिक्सल बफर साफ़ करें, लेकिन और क्या?
धन्यवाद!
धन्यवाद केनी। यह एक अच्छी तरह से संक्षेप में वर्णन है; मुझे लगता है कि कच्चे ढेर बफर की अप्रत्याशितता से मुझे थोड़ा फेंक दिया गया था, लेकिन हमेशा के रूप में, नियमों पर भरोसा करें और आपको पुरस्कृत किया जाएगा। चीयर्स। –
बस कुछ स्पष्टीकरण जोड़ने के लिए, कोर फ़ंक्शंस में मुख्य शब्द "बनाएं" और "नया" हैं। यदि फ़ंक्शन में इनमें से कोई भी शब्द है, तो आपको लौटाई गई स्मृति को रिलीज़ करना होगा। अधिकांश कोर डेटा प्रकार CFType संगत हैं। जिसका अर्थ यह है कि यदि आप इसे आसान बनाते हैं तो आप उद्देश्य-सी बनाए रखने/रिलीज/ऑटोरेलीज़ कॉल का उपयोग कर सकते हैं। यानी [(आईडी) imageRef रिलीज]; या CFRelease (imageRef); –
यदि आप 'CFRelease' का उपयोग करते हैं तो' imageRef' 'NULL' जांचना याद रखें। – kennytm