मेरी पूछताछ यही है। कब कोई #import का उपयोग करता है और कब एक @class का उपयोग करता है?
सरल उत्तर: आप #importया #includeजब कोई शारीरिक निर्भरता है। अन्यथा, आप आगे घोषणाओं का उपयोग करें ( @class MONClass, struct MONStruct, @protocol MONProtocol)।
यहाँ शारीरिक निर्भरता के कुछ सामान्य उदाहरण दिए गए हैं:
- कोई भी C या C ++ मान (एक सूचक या संदर्भ भौतिक निर्भरता नहीं है)। यदि आपके पास एक
CGPointआइवर या संपत्ति है, तो संकलक को घोषणा को देखने की आवश्यकता होगी CGPoint।
- आपका सुपरक्लास।
- एक विधि जिसका आप उपयोग करते हैं।
कभी-कभी यदि मैं @क्लास घोषणा का उपयोग करता हूं, तो मुझे एक आम संकलक चेतावनी दिखाई देती है जैसे कि निम्नलिखित: "चेतावनी: रिसीवर 'फूकोट्रॉलर' एक अग्रेषित वर्ग है और इसी @interface मौजूद नहीं हो सकता है।"
इस संबंध में संकलक वास्तव में बहुत उदार है। यह संकेत छोड़ देगा (जैसे ऊपर वाला), लेकिन आप अपने स्टैक को आसानी से कचरा कर सकते हैं यदि आप उन्हें अनदेखा करते हैं और #importठीक से नहीं करते हैं । हालांकि यह (IMO) होना चाहिए, कंपाइलर इसे लागू नहीं करता है। एआरसी में, संकलक अधिक सख्त है क्योंकि यह संदर्भ गिनती के लिए जिम्मेदार है। क्या होता है संकलक एक डिफ़ॉल्ट पर वापस गिर जाता है जब यह एक अज्ञात विधि का सामना करता है जिसे आप कहते हैं। प्रत्येक रिटर्न मान और पैरामीटर माना जाता है id। इस प्रकार, आपको अपने कोडबेस से हर चेतावनी को मिटाना चाहिए क्योंकि इसे भौतिक निर्भरता माना जाना चाहिए। यह एक सी फ़ंक्शन को कॉल करने के लिए अनुरूप है जो घोषित नहीं है। सी के साथ, पैरामीटर माना जाता है int।
आपके द्वारा आगे की घोषणाओं का पक्ष लेने का कारण यह है कि आप अपने बिल्ड समय को कारकों से कम कर सकते हैं क्योंकि न्यूनतम निर्भरता है। आगे की घोषणाओं के साथ, कंपाइलर देखता है कि एक नाम है, और शारीरिक रूप से निर्भरता न होने पर कक्षा की घोषणा या उसके सभी निर्भरता को देखे बिना प्रोग्राम को सही ढंग से पार्स और संकलित कर सकता है। स्वच्छ बिल्ड में कम समय लगता है। इंक्रीमेंटल बिल्ड में कम समय लगता है। निश्चित रूप से, आपको यह सुनिश्चित करने में थोड़ा अधिक समय खर्च करना होगा कि आपके द्वारा आवश्यक सभी हेडर परिणाम के रूप में हर अनुवाद को दिखाई देते हैं, लेकिन यह कम बिल्ड समय में जल्दी से भुगतान करता है (यह मानते हुए कि आपका प्रोजेक्ट छोटा नहीं है)।
यदि आप उपयोग करते हैं #importया #includeइसके बजाय, आप कंपाइलर पर बहुत अधिक काम फेंक रहे हैं, तो यह आवश्यक है। आप जटिल हेडर निर्भरता भी शुरू कर रहे हैं। आप इसे एक ब्रूट-फोर्स एल्गोरिथ्म के समान कर सकते हैं। जब आप #import, आप अनावश्यक जानकारी के टन में खींच रहे हैं, जो स्रोतों की पार्स करने और संकलित करने के लिए बहुत अधिक मेमोरी, डिस्क I / O और CPU की आवश्यकता होती है।
ObjC निर्भरता के संबंध में C आधारित भाषा के लिए आदर्श के बहुत करीब है क्योंकि NSObjectप्रकार कभी भी मान नहीं NSObjectहोते हैं - प्रकार हमेशा संदर्भ गिने बिंदु होते हैं। तो आप अविश्वसनीय रूप से तेजी से संकलन समय के साथ दूर हो सकते हैं यदि आप अपने कार्यक्रम की निर्भरता को उचित रूप से और आगे बढ़ाते हैं जहां संभव है क्योंकि बहुत कम शारीरिक निर्भरता की आवश्यकता होती है। निर्भरता को और कम करने के लिए आप क्लास एक्सटेंशन में भी संपत्तियों की घोषणा कर सकते हैं। यह बड़ी प्रणालियों के लिए एक बहुत बड़ा बोनस है - अगर आपको कभी भी एक बड़ा सी ++ कोडबेस विकसित किया है, तो आपको यह अंतर पता चल जाएगा।
इसलिए, मेरी सिफारिश है कि जहां संभव हो आगे का उपयोग करें, और फिर #importजहां भौतिक निर्भरता है। यदि आप चेतावनी या कोई अन्य जो भौतिक निर्भरता का अर्थ देखते हैं - उन सभी को ठीक करें। फिक्स #importआपकी कार्यान्वयन फ़ाइल में है।
जैसा कि आप पुस्तकालयों का निर्माण करते हैं, आप संभवतः एक समूह के रूप में कुछ इंटरफेस को वर्गीकृत करेंगे, इस मामले में आप #importउस पुस्तकालय को देखेंगे जहां भौतिक निर्भरता पेश की गई है (उदाहरण के लिए #import <AppKit/AppKit.h>)। यह निर्भरता का परिचय दे सकता है, लेकिन पुस्तकालय अनुरक्षक अक्सर आपके लिए आवश्यकतानुसार भौतिक निर्भरता को संभाल सकते हैं - यदि वे एक विशेषता का परिचय देते हैं, तो वे आपके निर्माण पर पड़ने वाले प्रभाव को कम कर सकते हैं।