2009-07-31 12 views
33

इसलिए मैंने सोचा कि मेरे पास ये सभी प्रश्न हैं। फिर अचानक मुझे एक त्रुटि (एक दुर्घटना) मिलती है जिसे मैं समझ नहीं सकता। फिर दुर्घटना का समाधान करने के लिए शोध करने के बाद, मुझे लगता है कि मैंने सोचा कि मुझे इन महत्वपूर्ण क्षेत्रों के बारे में पता था कुछ हद तक गलत है। इन के जवाब बहुत मदद मिलेगी मुझे मेरी समझ ट्रैक पर वापस आने -रिलीज, डेलोक, और सेल्फ रेफरेंस

नीचे 8 सवाल मैं सिर्फ किसी को जवाब देने की उम्मीद में वहाँ बाहर शूट करने के लिए जा रहा हूँ कर रहे हैं। समय से पहले धन्यवाद!

क्यू 1) यह एक वस्तु पर रिलीज कॉल करने के लिए करता है, तो उस संदर्भ नहीं के बराबर है ठीक है? यह हानिरहित होना चाहिए, है ना?

Q2) यह एक वस्तु पर रिलीज कॉल करने के लिए करता है, तो उस संदर्भ जारी की गई है और 0 के लिए एक संदर्भ के रूप में गिनती ठीक है?

क्यू 3) क्या इसे जारी करने के बाद शून्य के संदर्भ को सेट करना आवश्यक है? क्या होता है यदि आप इसे शून्य पर सेट नहीं करते हैं?

प्रश्न 4) क्या वास्तव में शून्य और न्यूल के बीच कोई अंतर है, या क्या पाठक/डेवलपर को ऑब्जेक्ट प्रकार को केवल उस पर ध्यान से जानने में मदद करने के लिए यह एक अर्थपूर्ण बात है?

प्रश्न 5) गुणों का उपयोग करना 'स्वयं' सूचक का उपयोग करने की आवश्यकता है?

Q6) उदाहरण चर का उपयोग करना आवश्यक है कि 'स्व' सूचक इस्तेमाल नहीं कर रहा है?

क्यू 7) मैं कभी भी अपनी संपत्ति के बजाय एक आवृत्ति चर का उपयोग कब करना चाहूंगा? मुझे लगता है कि मूल्य प्रकार डेटा सदस्य ठीक हैं क्योंकि वे रिलीज़ नहीं कर रहे हैं और शामिल नहीं हैं।

प्रश्न 8) यह dealloc समारोह के भीतर से एक वस्तु के dealloc कॉल करने के लिए आवश्यक है? कई उदाहरणों में मैंने रिलीज को देखा है, लेकिन डेलोक नहीं - क्या ऐसे ट्यूटोरियल गलत हैं?

+0

अच्छा क्यू।मुझे बस कुछ नए प्रश्न मिले जो मुझे नहीं पता था कि मैं जवाब देना चाहता था। – typeoneerror

उत्तर

11

आपको शायद इस प्रश्न को कई अलग-अलग प्रश्नों में विभाजित करना चाहिए, लेकिन मैं काट दूंगा।

  1. हां, शून्य पर भेजा गया कोई भी संदेश नो-ऑप है।
  2. नहीं। 0 की रेफ-गिनती वाला एक ऑब्जेक्ट किया गया है, या जल्द ही नष्ट हो जाएगा और इसके लिए भेजे गए किसी भी संदेश से दुर्घटना हो सकती है, या सबसे अच्छा, अपवाद।
  3. यह स्थिति पर निर्भर करता है। यदि आप -dealloc में चीजें जारी कर रहे हैं, तो शायद नहीं। यदि यह एक वस्तु है जो किसी विशेष विधि से गुजरती है, तो शायद नहीं। यदि यह एक ivar है जिसका पुन: उपयोग किया जाता है, तो मैं हाँ कहूंगा। पहले दो मामलों में, कुछ भी नहीं होगा यदि आप पॉइंटर्स को शून्य पर सेट नहीं करते हैं, क्योंकि आप आमतौर पर उन पॉइंटर्स तक पहुंच नहीं पाएंगे। आखिरी मामला हालांकि, आप अभी भी पॉइंटर तक पहुंच सकते हैं, जो कि विलुप्त स्मृति को इंगित कर रहा है। यदि आप इसे एक संदेश भेजते हैं या इसे अस्वीकार करने का प्रयास करते हैं, तो आपका ऐप क्रैश हो जाएगा।
  4. वे दोनों 0. के बराबर सम्मेलन nil करके वस्तु संकेत के लिए प्रयोग किया जाता है, और NULL किसी अन्य संकेत के लिए इस्तेमाल किया है, लेकिन मिश्रण उन्हें किसी भी समस्याओं का कारण नहीं होगा है।
  5. यदि आप संपत्ति गेटटर/सेटर का आह्वान करना चाहते हैं, तो हाँ। यदि आप ivar तक पहुंचना चाहते हैं तो यह सीधे (असामान्य) encapsulates, नहीं।
  6. नहीं, आप सिंटैक्स self->ivar का उपयोग कर इंस्टेंस चर का उपयोग कर सकते हैं। वास्तव में, जब आप केवल ivar टाइप करते हैं, तो संकलक स्पष्ट रूप से self-> डीरफ़्रेंसिंग जोड़ता है।
  7. सुनिश्चित नहीं है कि आपका यहां क्या मतलब है।
  8. एकमात्र बार आपको -dealloc पर कॉल करना चाहिए, जब [super dealloc]; को अपने -dealloc विधियों में कॉल करना है। किसी भी अन्य वस्तुओं के लिए आपको हमेशा -release पर कॉल करना चाहिए।
+0

पर (2) NSZombieEnabled का उल्लेख किया जाना चाहिए। यह एबोक समस्याओं को डीबगिंग आसान बनाता है। – diciu

+0

"आसान" एक मजबूत शब्द है! मैं "आसान" कहूंगा। –

19

A1) [nil release] ठीक है (कुछ नहीं करेंगे)

A2) नं वस्तुओं मत छुओ के बाद वे पुनः आवंटित की जाती किया गया है। उन्हें रिहा होने के बाद शून्य पर सेट किया जाना चाहिए।

ए 3) रिलीज पॉइंटर को शून्य पर सेट करना जरूरी नहीं है, लेकिन आपको खतरनाक पॉइंटर्स मिलते हैं (यानी, आप यह नहीं बता सकते कि कोई ऑब्जेक्ट मान्य है या नहीं)। संपत्ति को शून्य पर सेट करने के लिए अक्सर अंतर्निहित ivar को रिलीज़ करने के लिए उपयोग किया जाता है, इसलिए ऐसा करने में असफल होने से स्मृति रिसाव

ए 4) शून्य और न्यूल दोनों शून्य हैं, इसलिए तकनीकी रूप से वही हैं।

ए 5) हाँ, आप गुणों के लिए self.someProperty का उपयोग करना चाहिए, जैसा कि आप [self someProperty] का प्रयोग करेंगे यह सिर्फ एक विधि

A6) स्वयं अनिवार्य रूप से एक struct है नहीं था, तो आप ऐसा तरह ivars पहुँच सकते हैं: self->someIvar। हालांकि, इसकी कोई ज़रूरत नहीं है।

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

ए 8 रिलीज़ करने की आवश्यकता है) रिलीज को सही समय कहा जाता है जब dealloc स्वचालित रूप से कॉल किया जाता है। आपको सीधे डेलोक को कॉल नहीं करना चाहिए ([सुपर डेलोक] को छोड़कर)

+1

मैं # 5 के बारे में उलझन में हूँ। मेरे पास व्यू कंट्रोलर में "सोशल" नामक एक गैर-स्थानिक, संरक्षित @property है और ये कथन एक ही चीज़ को लॉग करते हैं: NSLog (@ "% @", social); और एनएसएलओजी (@ "% @", self.social); क्या आप समझा सकते हैं, टॉम? – typeoneerror

+1

ऐसा इसलिए है क्योंकि 'NSLog' कथन दोनों एक ही वस्तु को प्रिंट कर रहे हैं। अंतर यह है कि 'self.social' एक विधि को कॉल करता है जो ऑब्जेक्ट देता है, और' सोशल 'केवल ऑब्जेक्ट ही होता है। –

8

अन्य ने 1-6 पर्याप्त रूप से उत्तर दिया है।

(7) ऐप्पल आपको अपने इनिट और डेलोक दोनों में सीधे आवृत्ति चर का उपयोग करने की सलाह देता है। मुख्य रूप से ऐसा इसलिए होता है क्योंकि ऑब्जेक्ट (विशेष रूप से यदि यह उपclassed है) केवल इन तरीकों के दौरान आंशिक रूप से स्थापित किया गया है, और इसलिए सेटर्स/गेटर्स को कॉल करने से गलत व्यवहार हो सकता है यदि उनके पास छोटे कार्यों के अलावा कुछ भी है। आम तौर पर आप अपने ऑब्जेक्ट में सीधे ivar (गेटर के माध्यम से) तक सुरक्षित रूप से पहुंच सकते हैं, और ऐसा करने के लिए यह थोड़ा अधिक प्रभावशाली होगा (केवल आईफोन पर रिलीज़)। आम तौर पर आपको सभी मामलों में सेटर का उपयोग करना चाहिए, खासकर अगर आपकी ऑब्जेक्ट को उप-वर्गीकृत किया जा सकता है या अन्य लोग संपत्ति देख रहे हैं।

(8) आप कभी भी, कभी भी, dealloc (डेलोक विधि के भीतर से [सुपर डेलोक] को छोड़कर) कॉल नहीं करते हैं। यदि आपके पास किसी अन्य ऑब्जेक्ट पर स्वामित्व है, तो आपको उस स्वामित्व को छोड़ना चाहिए (रिलीज या ऑटोरेलीज़ को कॉल करके)। यदि उपयुक्त हो तो सिस्टम ऑब्जेक्ट पर डेलोक को कॉल करेगा। लेकिन आप कभी खुद को डेलोक कहते हैं। memory management rules पढ़ें (इसके केवल 9 अनुच्छेद और समझने के लिए महत्वपूर्ण है)।

+0

धन्यवाद। मुझे कहीं भी एमएम नियमों का लिंक मिला जो किसी ने इंगित किया। बीमार यह निश्चित रूप से पढ़ रहे हैं। –

+0

बीटीडब्ल्यू, ये सभी प्रश्न तब आए जब एक अप्रत्याशित दुर्घटना के बाद रिलीज और नील का मेरा विचार टूट गया था (ऐप के संदर्भ को सेट करने के बाद ऐप क्रैश हो गया था)। ऐप दुर्घटनाग्रस्त होने के लिए धरती पर एक सूचक क्यों लगाएगा? तब से मैं हर जगह 'स्वयं' का उपयोग कर रहा हूं जहां मैं किसी अन्य संदर्भ में सूचक को असाइन करता हूं। –

+0

शून्य का संदर्भ स्थापित करने का एकमात्र कारण क्रैश होगा यदि संदर्भ अमान्य या अस्वीकृत ऑब्जेक्ट का हिस्सा था। NSZombies सक्षम करें और शायद इससे मदद मिलेगी। –

0

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

इसके बजाय, मैं रिलीज बी, तो मैं नियंत्रक बना सकते हैं और बी के लिए असाइन करें उसके बाद, एक के viewDidAppear विधि में, मैं रिलीज बी

मेरा मानना ​​है कि इस सूत्र अब बंद है। धन्यवाद!

0

ए 4) वे अपने प्रकार में भिन्न होते हैं। वे सभी शून्य हैं, लेकिन नल शून्य है *, शून्य एक आईडी है, और नील एक क्लास पॉइंटर है।

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