2009-04-29 18 views
9

मैं एक नंबर को परिभाषित कर रहा हूँ, इस प्रकार है:क्या मुझे अपने NSNumber को स्पष्ट रूप से आवंटित करने की आवश्यकता है?

NSNumber *nn0 = [NSNumber numberWithInt:0]; 

यह किसी भी alloc बिना ठीक काम करता है। मेरी समझ यह है कि यदि मैं संख्या WithInt का उपयोग करता हूं, तो आवंटित और init स्वचालित रूप से बुलाया जाता है।

अगर मैं अपने समारोह के अंत में जारी करने के लिए प्रयास करते हैं, मैं समस्याओं में चलाने:

[nn0 release]; 

मैं एक रनटाइम त्रुटि मिलता है।

मेरा प्रश्न है: यदि मैं NSNumber प्रारंभ करने के लिए संख्या WithInt का उपयोग करता हूं, तो क्या मुझे इस पर कोई मेमोरी प्रबंधन करना है?

उत्तर

15

कई प्रकार के लिए "सुविधा निर्माता" एक ऑब्जेक्ट उत्पन्न करते हैं जो स्वचालित रूप से "ऑटोरेलेज्ड" होता है - यानी नया ऑब्जेक्ट वर्तमान NSAutoreleasePool द्वारा बनाए रखा जाएगा। आपको इन ऑब्जेक्ट्स को मैन्युअल रूप से रिलीज़ करने की आवश्यकता नहीं है - जब वर्तमान NSAutoreleasePool जारी/निकाला जाता है तो उन्हें रिहा कर दिया जाएगा।

सुविधा कन्स्ट्रक्टर के विवरण के लिए यह पृष्ठ देखें, और इनके लिए स्मृति को कैसे व्यवस्थित करें।

http://www.macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

+0

बस उत्सुक क्यों है कि यह डाउनवॉट क्यों हो रहा है? क्या यह सही नहीं है? मैं मैक देव के लिए बिल्कुल नया हूं, बस कुछ मदद देने की कोशिश कर रहा हूं। –

+1

यह शायद शब्दावली के कारण है। असल में, एक सुविधा विधि (या आपके नियंत्रण के बाहर किसी भी विधि) द्वारा लौटाई गई कुछ भी "स्वत: समाप्त नहीं" माना जाता है। इसके बजाय इसे आपके द्वारा "स्वामित्व" नहीं माना जाता है। मुद्दा यह है कि, वास्तव में कैसे स्मृति को प्रबंधित किया जाता है उन वस्तुओं पर प्रासंगिक नहीं है जिन्हें आप "स्वयं" नहीं करते हैं। –

+0

मैंने इस प्रतिक्रिया को लिंक के कारण सही के रूप में चिह्नित किया है। जेसन, आपकी प्रतिक्रिया भी उत्कृष्ट थी, मेरी इच्छा है कि मैं दोनों को सही उत्तर के रूप में चिह्नित कर सकूं। –

7

बस मूल मेमोरी-प्रबंधन नियम का पालन करें: यदि आप चर के "स्वामित्व" हैं, तो आपको अंततः स्वामित्व छोड़ना होगा। आप स्वामित्व लेते हैं: वस्तु (आवंटन/नई/प्रतिलिपि) बनाना या विशेष रूप से स्वामित्व लेना (बनाए रखना)। इन सभी मामलों में, आपको इसे जारी करना होगा।

यदि आपको ऑब्जेक्ट की आवश्यकता है, तो आपको इसके स्वामित्व की आवश्यकता है। तो यदि आप जानते हैं कि आपको केवल इस विधि के लिए संख्या की आवश्यकता है (इसे किसी सरणी या जो कुछ भी पास करना है), सुविधा विधि का उपयोग करें और बस इसे छोड़ दें। यदि आप किसी कारण (और उदाहरण चर, उदाहरण के लिए) के लिए संख्या रखना चाहते हैं, तो आप इसे सुरक्षित रूप से आवंटित/इनिट कर सकते हैं।

यदि आप ऐसा कुछ जारी करते हैं जो आपके पास नहीं है, तो आपको रनटाइम त्रुटि मिल जाएगी।

4

नियम सरल, बहुत कुछ अपवादों के साथ है:

एक वस्तु लौटने चयनकर्ता शब्द "नया", "alloc", "बनाए रखने" या "प्रतिलिपि" में है यह, तो आप लौटे ऑब्जेक्ट के मालिक हैं और जब आप समाप्त कर लें तो इसे जारी करने के लिए ज़िम्मेदार हैं।

अन्यथा आपके पास इसका स्वामित्व नहीं है और इसे जारी नहीं करना चाहिए। यदि आप किसी गैर-स्वामित्व वाली वस्तु का संदर्भ रखना चाहते हैं, तो आपको उस उदाहरण पर -[NSObject retain] पर कॉल करना चाहिए। जब आप इसके साथ काम करते हैं तो उदाहरण के लिए अब आप "खुद" हैं, इसलिए -[NSObject release] पर कॉल करना चाहिए। इस प्रकार आपके पास -[NSNumber numberWithInt:] द्वारा लौटाए गए उदाहरण का स्वामित्व नहीं है और इसे पूरा होने पर -release पर कॉल नहीं करना चाहिए। यदि आप वर्तमान दायरे से बाहर लौटा हुआ उदाहरण रखना चाहते हैं (वास्तव में वर्तमान NSAutoreleasePool उदाहरण के जीवनकाल से परे), तो आपको -retain यह होना चाहिए।

RegEx शर्तों में, पीटर होसे ने अपने blog में इसे बहुत अच्छी तरह से प्रस्तुत किया।आप वापस आ वस्तु दृष्टान्त ही करता है, तो पद्धति चयनकर्ता इस regex से मेल खाता:

/^retain$|^(alloc|new)|[cC]opy/ 
बेशक

, निश्चित संदर्भ Memory Management Programming Guide for Cocoa है।

+0

उस रेगेक्स के लिए एकमात्र अपवाद मैंने पाया है: एनएसडीएटी + डेटाविथबाइट्सओकोपी: लंबाई: [फ्रीहेनडोन:], जो इसके नाम के बावजूद एक ऑटोरेलाइज्ड एनएसडीटा लौटाता है। यहां तक ​​कि बिल्ड-एंड-विश्लेषण/क्लैंग चेकर भी एक गलत प्राप्त करते हैं। – qwzybug

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

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