2010-11-03 6 views
6

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

myClass *newObject = [[myClass alloc] init]; 

धन्यवाद एक बहुत:

myClass *newObject = [myClass alloc]; 
बजाय

उत्तर

16

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

कई कक्षाएं उम्मीद करती हैं कि उनके init विधियों को बुलाया जाता है और यदि आप init पर कॉल नहीं करते हैं तो संभवतः क्रैश हो जाएंगे। यदि आप कस्टम क्लास के बारे में बात कर रहे हैं जो NSObject से सीधे प्राप्त होता है और इंस्टेंस चर के प्रारंभिकरण की आवश्यकता नहीं है, तो आप [myClass alloc] से दूर हो सकते हैं लेकिन यह निश्चित रूप से अच्छी प्रोग्रामिंग शैली नहीं है।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। "यदि आप एक कस्टम क्लास के बारे में बात कर रहे हैं जो सीधे एनएसओब्जेक्ट से विरासत में आता है और उसे आवृत्ति चर के प्रारंभिकरण की आवश्यकता नहीं है, तो आप [myClass alloc] से दूर हो सकते हैं लेकिन यह निश्चित रूप से अच्छी प्रोग्रामिंग शैली नहीं है।" वह मेरा मामला था। जवाब स्वीकार किया गया। – toupper

+2

@ टॉपर: यह उल्लेखनीय है कि यदि आप एक छोटा वाक्यविन्यास चाहते हैं, तो आप '[myClass new] कर सकते हैं; 'जो' [[myClass alloc] init] के बराबर है;', लेकिन इसे शायद ही कभी प्रचलित माना जा सकता है । –

2

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

आप इस लेख http://www.informit.com/articles/article.aspx?p=1398610

+0

बहुत बहुत धन्यवाद, उपयोगी जानकारी। – toupper

+0

मुझे पूरी तरह से बिंदु "कोको डिजाइन पैटर्न - दो चरण निर्माण" नहीं मिला है: यह दावा करता है कि दो चरण निर्माण बेहतर है क्योंकि यह "रचनाकार/वर्ग विधियों/फैक्ट्री विधियों" के विस्फोट से बचाता है, लेकिन जावा की तुलना में नहीं, [[फू एलोक] init] फू f = new foo() के समान; f.init() ;? –

0

मुझे लगता है कि यह ज्यादा बात नहीं करता है, तो आप एक "को लागू नहीं किया जाएगा पढ़ सकते हैं - (आईडी) init "क्योंकि यदि आपने किया था, तो आप NSObject की init विधि को कॉल करेंगे जो आपके द्वारा विधि में भेजे गए वही मान को लौटाता है। हालांकि आपका इंस्टेंस वैरिएबल सेट करने के लिए अपनी खुद की init विधि बनाना एक अच्छा विचार है।