2011-10-25 11 views
6

मान लीजिए मैं कुछ समारोह से एक सी स्ट्रिंग हो रही है:मेमोरी मैनेजमेंट: NSString के stringWithCString: एन्कोडिंग:

char * mystring = SomeCFunction(...);

और मैं इस स्ट्रिंग के मालिक हैं (मैं इसे मुक्त कराने के लिए जिम्मेदार है, जब मैं काम पूरा हुआ हूं)।

NSString * mynsstring = [NSString stringWithCString:mystring 
              encoding:NSUTF8StringEncoding]; 

मैं अभी भी मूल सी स्ट्रिंग को मुक्त कराने के लिए उत्तरदायी हूं:

हैं, ऑब्जेक्टिव-सी में, मैं एक NSString * का उपयोग कर बनाने के?

मुझे लगता है कि उत्तर हाँ है, लेकिन मुझे प्रलेखन में एक निश्चित उत्तर नहीं मिल रहा है - और विपरीत विधि (cStringUsingEncoding) की कार्यक्षमता, जबकि सनसनीखेज, मुझे रोक देता है, क्योंकि यह मुझे संभालता है सीस्ट्रिंग आपके लिए मुफ्त।

यदि उत्तर हाँ है, तो क्या मैं यह सुनिश्चित करने के लिए ज़िम्मेदार भी हूं कि मैं NSString * का उपयोग करने से पहले सी स्ट्रिंग को मुक्त नहीं करता हूं, या फ़ंक्शन मेरे लिए स्ट्रिंग की प्रतिलिपि बनाता है? मैं इस पूछना क्योंकि stringWithCString के लिए प्रलेखन यह कहते हैं:

एक स्ट्रिंग किसी दिए गए सी सरणी में बाइट्स वाले रिटर्न, किसी दिए गए एन्कोडिंग के अनुसार व्याख्या की ।

जो मुझे अभी भी बाइट्स की प्रतिलिपि बना रहा है, या यह आंतरिक रूप से इंगित कर रहा है (और मैं मूल रूप से केवल एक कलाकार कर रहा हूं) सोच रहा हूं।

उत्तर

8

यह बाइट्स की प्रतिलिपि बनाता है।

यदि आप बाइट्स की प्रतिलिपि बनाना नहीं चाहते हैं, तो आप इसके बजाय - (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)flag का उपयोग कर सकते हैं।

यदि आप - (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding या stringWithCString:encoding: जैसी किसी भी वस्तु विधि का उपयोग करते हैं, तो यह स्वयं निम्न स्तर की विधि को कॉल करता है, बाइट कॉपी किए जाते हैं।

+0

आह! तुम कमाल हो। धन्यवाद! स्वीकृति-अवरोधक टाइमर पर 6 मिनट शेष होने के बाद मैं उत्तर स्वीकार करूंगा। – Steve

+0

यह दस्तावेज़ों पर होना चाहिए –

+0

@ एंड्रेफ्रेटेलि I सुझाव है कि आप एक फीडबैक दर्ज करें (ऑनलाइन दस्तावेज के प्रत्येक पृष्ठ के नीचे एक लिंक है) इसलिए ऐप्पल इसे वहां जोड़ता है ;-) – AliSoftware

3

एपीआई को पता नहीं है कि आप जिस पॉइंटर को पास करते हैं वह कहां से आता है, इसलिए यह नहीं जानता कि इसका स्वामित्व कैसे लें। यह malloc() से हो सकता है, लेकिन यह एक इंटीरियर सूचक या mmap() से भी हो सकता है, जिसमें मामला मुक्त() काम नहीं करेगा। इसलिए एपीआई को डेटा कॉपी करने के लिए मजबूर किया जाता है।

एकमात्र समय जब आप कोको एपीआई में सी बफर के स्वामित्व को पारित कर सकते हैं तो यह है कि यदि एपीआई आपको यह बताने की अनुमति देता है कि उसे मुफ्त में आवश्यकता है। उदाहरण के लिए, -[NSData initWithBytesNoCopy:length:freeWhenDone:] पर एक नज़र डालें।

+0

+1, हाँ, यह बहुत कुछ बनाता है मुझे समझ में आता है ... कभी-कभी मैं ऐप्पल डॉक्स के साथ इस तरह की चीजों के बारे में थोड़ा और स्पष्ट था - आपको अपने लिए उन चीज़ों को कम करने के लिए छोड़ने के बजाय। इस मामले में यह मुझे काफी देर तक संकोच कर रहा था कि मुझे लगा कि मुझे पूछना चाहिए। – Steve

+0

पर्याप्त मेला। एक बग फ़ाइल करें और इसके लिए दस्तावेज़ में स्पष्ट रूप से बुलाए जाने के लिए कहें। – kperryua

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