दिलचस्प पोस्ट
घुमाएं: संबंधित मेनू आइटम के साथ, एक बटन समूह के साथ एक साथ टॉगल बटन लिंक करें Web.Config में असेंब्ली नोड का उद्देश्य क्या है? एक रेंज ऑब्जेक्ट दिया गया है, जब कोशिकाओं की एक श्रेणी में प्रत्येक सेल के माध्यम से लूप डेटाग्रिड दृश्य में वर्तमान में चयनित पंक्ति का सूचकांक Java.util.logging.Logger का उपयोग करते समय लॉग फ़ाइल को कैसे लिखना है Cassandra CQL में इनर शामिल हों क्या कोई जावा एक्सएमएल एपीआई है जो वर्ण संस्थाओं को हल किए बिना दस्तावेज़ को पार्स कर सकता है? देखने के लिए जांचें कि क्या स्ट्रिंग सीरियल की गई है? डेटाटाइव में डुप्लिकेट / नॉन-अनन्य पंक्तियों को फ़िल्टर करना मोंगोज ऑटो इंक्रीमेंट प्रति कोर धागे की इष्टतम संख्या स्थानीय ऐप इंजन डेवलपमेंट सर्वर से BigQuery तक पहुंचने में असमर्थ MKMapView या UIWebView ऑब्जेक्ट पर छूने वाले घटनाओं को कैसे रोकें? जावास्क्रिप्ट IOS5 "जावास्क्रिप्ट निष्पादन समयबाह्य हो गया" एमवीवीएम प्रकाश – अन्य दृश्य मॉडल में संपत्ति का उपयोग कैसे करें

उद्देश्य सी में मुझे क्यों जांचना चाहिए कि आत्म = शून्य नहीं है?

मेरे पास उद्देश्य-सी में init विधियों को लिखने के बारे में एक सामान्य प्रश्न है

मैं इसे हर जगह (ऐप्पल के कोड, किताबें, ओपन सोर्स कोड आदि) देखता हूं कि एक init विधि को जांचना चाहिए कि क्या आत्म = [सुपर इनिट] प्रारंभिकता के साथ जारी रखने से पहले शून्य नहीं है

एक init विधि के लिए डिफ़ॉल्ट ऐप्पल टेम्पलेट है:

- (id) init { self = [super init]; if (self != nil) { // your code here } return self; } 

क्यूं कर?

मेरा मतलब यह है कि कभी भी जब कभी शून्य नहीं होता है? अगर मैं एनएसओबीक पर init बुलाया और वापस शून्य नहीं मिला, तो कुछ सचमुच खराब हो, सही होगा? और उस मामले में, आप एक कार्यक्रम भी नहीं लिख सकते हैं …

क्या यह वास्तव में आम है कि कोई वर्ग 'init पद्धति शून्य हो सकती है? यदि हां, तो किस मामले में और क्यों?

Solutions Collecting From Web of "उद्देश्य सी में मुझे क्यों जांचना चाहिए कि आत्म = शून्य नहीं है?"

उदाहरण के लिए:

 [[NSData alloc] initWithContentsOfFile:@"this/path/doesn't/exist/"]; [[NSImage alloc] initWithContentsOfFile:@"unsupportedFormat.sjt"]; [NSImage imageNamed:@"AnImageThatIsntInTheImageCache"]; 

… और इसी तरह। (नोट: यदि फ़ाइल मौजूद नहीं है तो एनएसडीटा एक अपवाद फेंक सकता है) वहां कुछ ऐसे क्षेत्र हैं जहां एक समस्या तब होती है जब वापसी शून्य अपेक्षित व्यवहार होता है, और इस वजह से यह निरंतरता के लिए हर समय बहुत अधिक नील की जांच करने के लिए मानक अभ्यास है

यह विशेष मुहावरा मानक है क्योंकि यह सभी मामलों में काम करता है।

असामान्य जबकि, जहां मामलों होगा …

 [super init]; 

… एक अलग उदाहरण देता है, इस प्रकार स्वयं को असाइनमेंट की आवश्यकता होती है

और ऐसे मामलों होंगे जहां शून्य हो जाएगी, इस प्रकार शून्य जांच की आवश्यकता होगी ताकि आपका कोड किसी आवृत्ति चर स्लॉट को प्रारंभ करने की कोशिश न करे जो अब मौजूद नहीं है।

निचला रेखा यह है कि यह उपयोग करने के लिए प्रलेखित सही पैटर्न है और, अगर आप इसे प्रयोग नहीं कर रहे हैं, तो आप इसे गलत कर रहे हैं।

मुझे लगता है कि, अधिकांश वर्गों में, अगर [सुपर इनिट] से रिटर्न वैल शून्य है और आप इसे मानक जांच के अनुसार सुझाए गए हैं, और फिर समय से पहले वापस लौटते हैं, मूलतः आपका एप अभी भी सही तरीके से काम नहीं कर रहा है। यदि आप इसके बारे में सोचते हैं, भले ही यदि (आत्म! = शून्य) जांच है, तो अपने वर्ग के उचित संचालन के लिए, 99.99% समय के लिए आपको वास्तव में आत्मनिर्भर होने की आवश्यकता होती है। अब, मान लीजिए, किसी भी कारण के लिए, [सुपर इनिट] वापस नहीं लौटती, मूल तौर पर शून्य के खिलाफ आपकी जांच मूल रूप से आपके वर्ग के कॉलर तक जाती है, जहां यह संभवतः असफल हो जायेगी, क्योंकि यह स्वाभाविक रूप से मान लेगा कि कॉल सफल।

असल में, मैं क्या कर रहा हूं यह है कि समय का 99.99%, अगर (आत्म! = शून्य) अधिक मजबूती के मामले में आप कुछ नहीं खरीदता है, क्योंकि आप केवल आपके इनवॉर्नर को पैसा दे रहे हैं वास्तव में यह मजबूत ढंग से संभालने में सक्षम होने के लिए, आपको वास्तव में अपने संपूर्ण कॉलिंग पदानुक्रम में चेक लगाए जाने की आवश्यकता होगी। और फिर भी, केवल एक चीज जो आप खरीद लेंगे वह यह है कि आपका एप थोड़ी अधिक सफाईपूर्वक / मजबूती से विफल हो जाएगा। लेकिन यह अभी भी असफल होगा

यदि एक पुस्तकालय वर्ग ने मनमाने ढंग से [सुपर इनिट] के परिणामस्वरूप शून्य लौटने का फैसला किया है, तो आप बहुत ज्यादा वही है, और यह एक संकेत है कि पुस्तकालय कक्षा के लेखक ने कार्यान्वयन की गलती की है।

मुझे लगता है कि यह एक विरासत कोडन सुझाव का अधिक है, जब ऐप्स अधिक सीमित मेमोरी में चले गए

लेकिन सी स्तर कोड के लिए, मैं आम तौर पर एक नरक सूचक के खिलाफ malloc () के रिटर्न वेल्यू की जांच करता। जबकि, उद्देश्य-सी के लिए, जब तक मैं इसके विपरीत सबूत नहीं मिलता, मुझे लगता है कि मैं आमतौर पर अगर (आत्म! = शून्य) चेक को छोड़ देता हूं क्यों विसंगति?

क्योंकि, सी और मॉलोक स्तर पर, कुछ मामलों में आप वास्तव में आंशिक रूप से ठीक हो सकते हैं। जबकि मैं उद्देश्य-सी में सोचता हूं, 99.99% मामलों में, यदि [सुपर इनिट] वापस शून्य कर देता है, तो आप मूल रूप से एफ ऐड हैं, भले ही आप इसे संभाल करने की कोशिश करें। आप के रूप में अच्छी तरह से बस ऐप दुर्घटना होने और परिणाम के साथ सौदा हो सकता है।

यह ऊपर की टिप्पणियों का सार है

मान लीजिए सुपरकलैस रिटर्न nil क्या होने वाला है?

यदि आप सम्मेलनों का पालन नहीं करते हैं

आपका कोड आपके init विधि के मध्य में दुर्घटना है (जब तक कि init महत्व का कुछ भी नहीं)

यदि आप सम्मेलनों का पालन करते हैं, यह जानते हुए भी नहीं कि सुपर क्लास शून्य वापस लौट सकता है (अधिकांश लोगों का अंत यहां होता है)

आपका कोड कुछ समय बाद क्रैश होने वाला है, क्योंकि आपका nil , जहां आपको कुछ अलग होने की उम्मीद थी या आपका प्रोग्राम दुर्घटनाग्रस्त होने के बिना अप्रत्याशित रूप से व्यवहार करता है ओ प्यारे! क्या आप यह चाहते हैं? मुझे नहीं पता…

यदि आप सम्मेलनों का पालन करते हैं, तो स्वेच्छा से अपने उपवर्ग को शून्य वापस करने की इजाजत दे सकते हैं

आपका कोड प्रलेखन (!) स्पष्ट रूप से यह बताएगा कि "रिटर्न … या शून्य", और आपके बाकी कोड को इस से निपटने के लिए तैयार करने की आवश्यकता है। अब यह समझ में आता है

आमतौर पर, यदि आपकी कक्षा NSObject से सीधे प्राप्त होती है, तो आपको इसकी आवश्यकता नहीं होगी। हालांकि, इसमें शामिल होने की अच्छी आदत है, जैसे कि आपकी कक्षा अन्य कक्षाओं से प्राप्त होती है, उनके प्रारंभिक nil लौट सकते हैं, और यदि ऐसा है, तो आपका आरंभकर्ता उस पर कब्जा कर सकता है और सही ढंग से व्यवहार कर सकता है

और हां, रिकॉर्ड के लिए, मैं सर्वोत्तम अभ्यास का पालन करता हूं और इसे अपने सभी वर्गों पर लिखता हूं, यहां तक ​​कि उन एनएसओबीजेक्स से सीधे प्राप्त होते हैं।

आप सही हैं, आप अक्सर [super init] लिख सकते हैं, लेकिन यह केवल कुछ के उपवर्ग के लिए काम नहीं करेगा। लोग सिर्फ एक मानक लाइन कोड को याद रखना पसंद करते हैं और हर समय इसका उपयोग करते हैं, भले ही वह कभी-कभी जरूरी हो, और इस प्रकार हम मानक प्राप्त करते हैं if (self = [super init]) , जो शून्य होने की संभावना दोनों को वापस करता है और self बदले किसी अन्य वस्तु की संभावना को ध्यान में रखते हुए

एक आम गलती लिखना है

 self = [[super alloc] init]; 

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

 self = [super init]; 

यदि उप वर्ग के सदस्यों (वेरिएबल्स या अन्य ऑब्जेक्ट्स) को उप-वर्गों के सदस्यों को सेट करने से पहले इनिशियलाइज़ करने के लिए आवश्यक है अन्यथा ओजजेक रनटाइम इन सभी को 0 या शून्य तक आरंभ कर देता है। ( एएनएसआई सी के विपरीत, जो अक्सर उन सभी को समाशोधन के बिना स्मृति के खंड आवंटित करता है )

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

यह जांचने के लिए है कि intialazation काम करता है, यदि अगर कथन सही देता है यदि init विधि शून्य नहीं लौटाती है, तो यह वस्तु का सृजन जांचने का एक तरीका सही ढंग से काम करता है कुछ कारणों से मैं सोच सकता हूं कि init शायद असफल हो सकता है, यह एक अतिरेक इनट पद्धति है जो कि सुपर वर्ग के बारे में पता नहीं है या ऐसा कुछ नहीं, मुझे नहीं लगता कि यह आम है। लेकिन अगर ऐसा होता है, तो इसके बेहतर कुछ भी नहीं होने पर मुझे लगता है कि यह दुर्घटना है, इसलिए इसकी हमेशा जांच की जा रही है …

ओएस एक्स में, यह स्मृति के कारणों के कारण विफल होने के लिए -[NSObject init] लिए संभव नहीं है आईओएस के लिए भी ऐसा नहीं कहा जा सकता।

इसके अलावा, यह लिखने के लिए अच्छा अभ्यास है जब किसी वर्ग को उप- nil करना जो कि किसी भी कारण से nil हो।