2011-07-16 24 views

उत्तर

14

आपके उदाहरण में कोड के साथ मुख्य समस्या यह है कि कुछ मामलों में, -इनिट विधि उस ऑब्जेक्ट को वापस करती है जो आपके द्वारा बनाई गई + alloc। यदि ऐसा हुआ, तो आपका कोड गलत होगा क्योंकि आप [c init] के परिणाम को सी में निर्दिष्ट नहीं कर रहे हैं, और आप गलत ऑब्जेक्ट (और जिस पर ठीक से प्रारंभ नहीं किया गया है) के साथ काम करना समाप्त कर देगा। यही कारण है कि मानक मुहावरे हमेशा एक ही पंक्ति पर + एलोक और -इनिट को गठबंधन करना है:

आईडी सी = [[व्यक्ति आवंटित] init];

अब, आपने व्यक्ति वर्ग लिखा होगा और पहले हाथ का ज्ञान होगा कि हमेशा एक ही वस्तु वापस आती है, लेकिन मुझे अपने कोड को पढ़ने के लिए व्यक्ति के आंतरिक कार्यों से घनिष्ठ परिचित होना चाहिए और यह सही है या नहीं, इसका अर्थ है। आपका कोड इस अर्थ में "बेहतर" है कि कोई भी यह बता सकता है कि यदि आप सामान्य सम्मेलन का पालन करते हैं तो यह सही काम कर रहा है।

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

+1

+1 :) – Eiko

-1

सबसे पहले, कास्टिंग समस्या टाइप करें। हर बार जब आप 'c' का उपयोग करना चाहते हैं, तो आपको (Person *) की आवश्यकता हो सकती है, यानी टाइपकास्ट करें।

दूसरी बात, अगर आप किसी भी विधि व्यक्ति में घोषित है, तो आप यह [c aMthod] शैली के रूप में फोन नहीं कर सकते हैं, तो आप का उपयोग करने के, [(Person *) c aMethod].

+1

आपको ब्रैकेट के दूसरे सेट की आवश्यकता नहीं है ('[(व्यक्ति *) सी विधि]' – indragie

+2

हालांकि मुझे लगभग किसी भी प्रकार की आईडी टाइप करने की आवश्यकता नहीं है। – Eiko

4

जब id सामान्य प्रकार का उपयोग किया है, तो आपको एक चेतावनी अगर आप नहीं मिलेगा एक विधि को कॉल करने का प्रयास करें जो मौजूद नहीं है। संकलक आपको लगता है कि आप क्या कर रहे हैं।

अन्यथा, कोई समस्या नहीं है जिसके बारे में मैं सोच सकता हूं। यह कई परिस्थितियों में आम है (विषम कंटेनर प्रकार पर तेज गणना)

+0

+1 संक्षिप्त, सही उत्तर। संभावित -init बग को खोजने के लिए – Caleb

2

एक और संभावित खतरा यह है कि समय के साथ, आप तर्क जोड़ सकते हैं जो गलती से केवल कुछ मामलों के लिए init करता है ... आवंटित ऑब्जेक्ट को छोड़कर लेकिन प्रारंभ नहीं किया गया है इसका मतलब है कि इसमें सभी मूल्य अनिवार्य रूप से यादृच्छिक हैं और यह कोई सेटअप कोड था करने के लिए किया नहीं है।

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

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