2012-03-15 12 views
12

मैं इसे कुछ वर्षों से धार्मिक रूप से कर रहा हूं। [super init...] तरीकों बुला के बाद self की वैधता की जांच कर रहा:हम सभी इनिट तरीकों में अगर (स्वयं) की जांच क्यों करते हैं?

self = [super init]; 
if (self != nil) { 
    // initialize 
} 
return self; 

आप के रूप में अच्छी तरह से this question का सार विभिन्न तरीकों से में यह कर सकते हैं, लेकिन इस सवाल का सिंटैक्स के बारे में है, मेरा अवधारणा के बारे में है।

मुझे हाल ही में एक सहयोगी से एक प्रश्न मिला है जो उद्देश्य-सी सीख रहा है और उसने मुझसे पूछा, "मुझे स्वयं के अस्तित्व के लिए परीक्षण क्यों करना चाहिए, क्या यह स्पष्ट नहीं है कि यह वहां है?" और मेरा संक्षिप्त जवाब "गलती, हाँ, अच्छी तरह से ऐसे उदाहरण हैं जहां यह असफल हो सकता है, इसलिए यही कारण है।" लेकिन लंबा जवाब यह है कि मैं वास्तव में खुद को समझ नहीं पा रहा हूं कि हम हर जगह इसके लिए क्यों परीक्षण करते हैं, जब ऐसे मामलों में जहां यह असफल हो सकता है, वे बहुत दुर्लभ हैं। Apple's reference guide हमें कुछ विशिष्ट मामलों के बारे में बताता है, जैसे फाइलों के साथ प्रारंभ करना या सिंगलेट्स से निपटने के दौरान। लेकिन ये ध्वनि नियम के बहुत दुर्लभ अपवादों की तरह है कि [super init] एस सिर्फ काम करना चाहिए।

तो मेरा प्रश्न यह है कि: हम हमेशा स्वयं की वैधता का परीक्षण क्यों करते हैं? क्या हम इसे हर जगह कार्यान्वित कर रहे हैं ताकि वह उस अपवाद को पकड़ सके जहां यह होता है? क्यों न केवल पूरे if (self) चीज को छोड़ दें और हमारी वस्तु को आरंभ करें यदि सफल होने की संभावना 100% है (या यह कभी भी मामला नहीं है)?

पीएस मुझे एहसास है कि यह सवाल एक डुप्ली होना चाहिए क्योंकि यह बहुत बुनियादी है, लेकिन मेरे खोज प्रश्नों को प्रारंभिक वाक्यविन्यास के बारे में बहुत सारे प्रश्न हैं। डुप्लिक लिंक की सराहना की जाती है, चीयर्स!

+3

संभावित डुप्लिकेट [उद्देश्य-सी में मुझे क्यों जांचना चाहिए कि स्वयं = \ [सुपर init \] शून्य नहीं है?] (Http://stackoverflow.com/questions/1287950/in-objective-c-why- चाहिए-i-check-if-self-super-init-is-not-nil) – JeremyP

उत्तर

6

इस विषय पर a helpful old article है, जिसमें प्रारंभकर्ता के बारे में कुछ सामान्य गलतफहमी भी शामिल है। मैं कहूंगा कि मूल विचार यह है कि किसी विशेष वर्ग को अपने सुपरक्लास के कार्यान्वयन से संबंधित नहीं होना चाहिए, इसलिए हम हमेशा त्रुटि के मामले में nil की जांच करते हैं।

+1

लिंक किया गया लेख स्पॉट पर है। दुर्भाग्यवश, इस विषय पर वहां बहुत सारी गलत जानकारी है, जिनमें से कुछ चमकदार से भी हैं, जिन्हें विल शिपली के नाम से भी जाना जाता है (हालांकि विल ने इस विषय पर नीचे अपनी पोस्टिंग को सही किया है। मैं इससे लिंक नहीं करूंगा यह उत्तर देने वाले माइक ऐश के आलेख में कुछ भी, यदि कुछ भी जोड़ता है।) – ipmcc

+0

वह लेख वास्तव में सहायक है, मेरे सभी प्रश्नों का उत्तर देता है और फिर कुछ। धन्यवाद @ jtbandes! – epologee

1

उहम ... यह निश्चित रूप से एक अच्छा सवाल है, मेरी इच्छा है कि मैंने इसे बनाया है। मैं उद्देश्य सी में एक विशेषज्ञ नहीं हूँ, लेकिन मुझे लगता है मैं अपने हताशा महसूस कर सकते हैं, मेरी राय देने के लिए कोशिश करेगा downvoter के डर के बिना :-)

लेकिन:

err, yeah, well there's instances where it can fail, so that's why. 

यह एक पूरी तरह से अच्छा है जवाब। मुझे लगता है कि आप स्वयं की जांच नहीं कर रहे हैं, लेकिन आप जांच रहे हैं कि सुपर ऑब्जेक्ट सही ढंग से शुरू हुआ है, मेरे लिए यह एक अलग दृष्टिकोण है।

मुझे लगता है कि किसी भी मामले में यह जांचने के लिए हमेशा अच्छा अभ्यास होता है कि ऑब्जेक्ट आवंटित किया गया है और सही ढंग से प्रारंभ किया गया है, खासकर उद्देश्य-सी में जो सभी मास्करेड मेमोरी आवंटन मुद्दों के साथ सी के शीर्ष पर बैठता है। इनट 'ऑलोक' के बाद आते हैं, और यह वैरिएबल इत्यादि के साथ आवंटित ऑब्जेक्ट को प्रारंभ करना है ...

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

उद्देश्य-सी में इसके बजाय आपके पास कई कारणों से एक शून्य वस्तु हो सकती है, और यदि कोई एप्लिकेशन क्रैश नहीं है तो आप किसी अमान्य ऑब्जेक्ट को संदेश भेजना समाप्त कर सकते हैं। मुझे ईमानदार होना चाहिए, जब एनएसओब्जेक्ट के उप-वर्ग से सीधे तत्काल हो, तो मुझे शून्य की जांच करने की उपयोगिता नहीं पता है। लेकिन अगर मैं एक ढांचे में एक वर्ग का विस्तार कर रहा हूं, या दूसरों द्वारा प्रदान की गई स्थिर मुक्ति, मैं निश्चित रूप से वस्तु वैधता के लिए चेक के साथ सुरक्षित महसूस करूँगा।