निम्नलिखित उदाहरण में, संभावित समस्याएं क्या हो सकती हैं।आईडी के साथ आवंटित और आरंभ करने की अनुशंसा क्यों नहीं की जाती है?
id c = [Person alloc];
[c init];
निम्नलिखित उदाहरण में, संभावित समस्याएं क्या हो सकती हैं।आईडी के साथ आवंटित और आरंभ करने की अनुशंसा क्यों नहीं की जाती है?
id c = [Person alloc];
[c init];
आपके उदाहरण में कोड के साथ मुख्य समस्या यह है कि कुछ मामलों में, -इनिट विधि उस ऑब्जेक्ट को वापस करती है जो आपके द्वारा बनाई गई + alloc। यदि ऐसा हुआ, तो आपका कोड गलत होगा क्योंकि आप [c init]
के परिणाम को सी में निर्दिष्ट नहीं कर रहे हैं, और आप गलत ऑब्जेक्ट (और जिस पर ठीक से प्रारंभ नहीं किया गया है) के साथ काम करना समाप्त कर देगा। यही कारण है कि मानक मुहावरे हमेशा एक ही पंक्ति पर + एलोक और -इनिट को गठबंधन करना है:
आईडी सी = [[व्यक्ति आवंटित] init];
अब, आपने व्यक्ति वर्ग लिखा होगा और पहले हाथ का ज्ञान होगा कि हमेशा एक ही वस्तु वापस आती है, लेकिन मुझे अपने कोड को पढ़ने के लिए व्यक्ति के आंतरिक कार्यों से घनिष्ठ परिचित होना चाहिए और यह सही है या नहीं, इसका अर्थ है। आपका कोड इस अर्थ में "बेहतर" है कि कोई भी यह बता सकता है कि यदि आप सामान्य सम्मेलन का पालन करते हैं तो यह सही काम कर रहा है।
मुझे नहीं लगता कि सी टाइप आईडी के रूप में घोषित करना भयानक है, लेकिन यह इस मामले में मूर्खतापूर्ण प्रतीत होता है। आप जानते हैं कि सी व्यक्ति * प्रकार का होगा, तो इसे आईडी के रूप में क्यों घोषित करें और बेहतर जानकारी लिखने में मदद के लिए संकलक का उपयोग उपयोगी जानकारी को फेंक दें? यदि आईडी का उपयोग करने का कोई अच्छा कारण है, तो यह ठीक है, लेकिन यदि आप इस प्रकार के बारे में अधिक विशिष्ट हो सकते हैं तो आपको ऐसा करना चाहिए।
सबसे पहले, कास्टिंग समस्या टाइप करें। हर बार जब आप 'c
' का उपयोग करना चाहते हैं, तो आपको (Person *)
की आवश्यकता हो सकती है, यानी टाइपकास्ट करें।
दूसरी बात, अगर आप किसी भी विधि व्यक्ति में घोषित है, तो आप यह [c aMthod]
शैली के रूप में फोन नहीं कर सकते हैं, तो आप का उपयोग करने के, [(Person *) c aMethod].
जब id
सामान्य प्रकार का उपयोग किया है, तो आपको एक चेतावनी अगर आप नहीं मिलेगा एक विधि को कॉल करने का प्रयास करें जो मौजूद नहीं है। संकलक आपको लगता है कि आप क्या कर रहे हैं।
अन्यथा, कोई समस्या नहीं है जिसके बारे में मैं सोच सकता हूं। यह कई परिस्थितियों में आम है (विषम कंटेनर प्रकार पर तेज गणना)
+1 संक्षिप्त, सही उत्तर। संभावित -init बग को खोजने के लिए – Caleb
एक और संभावित खतरा यह है कि समय के साथ, आप तर्क जोड़ सकते हैं जो गलती से केवल कुछ मामलों के लिए init करता है ... आवंटित ऑब्जेक्ट को छोड़कर लेकिन प्रारंभ नहीं किया गया है इसका मतलब है कि इसमें सभी मूल्य अनिवार्य रूप से यादृच्छिक हैं और यह कोई सेटअप कोड था करने के लिए किया नहीं है।
+1 :) – Eiko