@class बनाम #import


709

यह मेरी समझ में आता है कि किसी को इवेंट में फॉरवर्ड-क्लास डिक्लेरेशन का उपयोग करना चाहिए क्लासए हेडर को शामिल करने के लिए क्लासए की आवश्यकता होती है, और क्लासबी को किसी भी सर्कुलर इंक्लूजन से बचने के लिए क्लासए हेडर को शामिल करने की आवश्यकता होती है। मैं यह भी समझता हूं कि #importयह एक सरल है ifndefताकि इसमें केवल एक बार ही शामिल हो।

मेरी जांच यह है: कोई कब उपयोग #importकरता है और कोई कब उपयोग करता है @class? कभी-कभी अगर मैं एक @classघोषणा का उपयोग करता हूं, तो मुझे एक सामान्य संकलक चेतावनी दिखाई देती है जैसे कि निम्नलिखित:

warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.

वास्तव में इसे समझने के लिए प्यार करेंगे, बनाम बस @classआगे-घोषणा को हटाने और एक #importको फेंकने के लिए चेतावनी को चुप करने के लिए संकलक मुझे दे रहा है।


10
फॉरवर्ड डिक्लेयरेशन केवल कंपाइलर को बताता है, "अरे, मुझे पता है कि मैं ऐसे सामान की घोषणा कर रहा हूं जिसे आप नहीं पहचानते हैं, लेकिन जब मैं @MyClass कहता हूं, तो मैं वादा करता हूं कि मैं इसे कार्यान्वयन में #import करूंगा"।
जोकोर्टोपासी

जवाबों:


754

यदि आप यह चेतावनी देखते हैं:

चेतावनी: रिसीवर 'MyCoolClass' एक अग्रेषित वर्ग है और इसी @interface मौजूद नहीं हो सकता है

आपको #importफ़ाइल की आवश्यकता है , लेकिन आप अपनी कार्यान्वयन फ़ाइल (.m) में ऐसा कर सकते हैं, और @classअपनी हेडर फ़ाइल में घोषणा का उपयोग कर सकते हैं।

@class(आमतौर पर) #importफ़ाइलों की आवश्यकता को नहीं हटाता है , यह बस आवश्यकता को उस स्थान के करीब ले जाता है जहां जानकारी उपयोगी है।

उदाहरण के लिए

यदि आप कहते हैं @class MyCoolClass, संकलक जानता है कि यह कुछ ऐसा देख सकता है:

MyCoolClass *myObject;

यह MyCoolClassएक वैध वर्ग के अलावा कुछ के बारे में चिंता करने की जरूरत नहीं है , और यह एक पॉइंटर के लिए कमरा आरक्षित करना चाहिए (वास्तव में, सिर्फ एक पॉइंटर)। इस प्रकार, आपके हेडर में @class90% समय लगता है।

हालाँकि, यदि आपको कभी भी myObjectसदस्य बनाने या पहुँच बनाने की आवश्यकता है , तो आपको संकलक को यह बताना होगा कि वे विधियाँ क्या हैं। इस बिंदु पर (संभवतः आपकी कार्यान्वयन फ़ाइल में), आपको #import "MyCoolClass.h"कंपाइलर को अतिरिक्त जानकारी केवल "यह एक वर्ग है" से परे बताने की आवश्यकता होगी ।


5
शानदार जवाब, धन्यवाद। भविष्य में संदर्भ के लिए: यह भी स्थितियों में, जहां आप के साथ संबंधित @classअपने में कुछ .hफ़ाइल है, लेकिन भूल जाते #importमीटर में यह, पर एक विधि का उपयोग करने की कोशिश @classएड वस्तु, और जैसे चेतावनी मिलती है: warning: no -X method found
टिम

24
ऐसा मामला जहां आपको @class के बजाय #import करने की आवश्यकता होगी, यदि .h फ़ाइल में आपके वर्ग के इंटरफ़ेस के लिए आवश्यक डेटा प्रकार या अन्य परिभाषाएँ शामिल हैं।
केन एस्पेसलघ

2
यहां उल्लेखित एक और महान लाभ त्वरित संकलन नहीं है। कृपया वेंकटेश्वर के उत्तर का संदर्भ लें
मार्टिनमोफर्ड

@BenGottlieb "myCoolClass" में उस 'मी' को अपरकेस नहीं होना चाहिए? में, "MyCoolClass" के रूप में?
बेसिल बॉर्क

182

तीन सरल नियम:

  • #importशीर्ष लेख फ़ाइलों ( .hफ़ाइलों) में केवल सुपर क्लास, और अपनाया हुआ प्रोटोकॉल ।
  • #importसभी कक्षाएं, और प्रोटोकॉल, आप कार्यान्वयन ( .mफ़ाइलों) में संदेश भेजते हैं ।
  • आगे की घोषणाओं के लिए बाकी सब कुछ।

यदि आप कार्यान्वयन फ़ाइलों में घोषणा को आगे बढ़ाते हैं, तो आप शायद कुछ गलत करते हैं।


22
हेडर फ़ाइलों में, आपको कुछ भी #import करना पड़ सकता है जो आपके वर्ग को अपनाने वाले प्रोटोकॉल को परिभाषित करता है।
टायलर

क्या h इंटरफ़ेस फ़ाइल या m कार्यान्वयन फ़ाइल में #import घोषित करने में अंतर है?
शमूएल जी

और #import यदि आप कक्षा से उदाहरण चर का उपयोग करते हैं
user151019

1
@ मर्क - नियम # 1 से आच्छादित, केवल अपने सुपरक्लास से आइवर का उपयोग करें, यदि तब भी।
PeyloW

@ टायलर ने प्रोटोकॉल की घोषणा को आगे क्यों नहीं बढ़ाया?
जोकोर्टोपस्सी

110

ADC पर उद्देश्य-सी प्रोग्रामिंग भाषा प्रलेखन देखें

एक वर्ग को परिभाषित करने वाले अनुभाग के तहत | क्लास इंटरफ़ेस यह बताता है कि ऐसा क्यों किया जाता है:

@क्लास निर्देश संकलक और लिंकर द्वारा देखे गए कोड की मात्रा को कम करता है, और इसलिए एक वर्ग नाम की आगे की घोषणा देने का सबसे सरल तरीका है। सरल होने के नाते, यह संभावित समस्याओं से बचा जाता है जो आयात करने वाली फ़ाइलों के साथ आ सकते हैं जो अभी भी अन्य फ़ाइलों को आयात करते हैं। उदाहरण के लिए, यदि एक वर्ग किसी अन्य वर्ग के सांख्यिकीय रूप से टाइप किए गए उदाहरण चर की घोषणा करता है, और उनकी दो इंटरफ़ेस फाइलें एक दूसरे को आयात करती हैं, तो न तो कक्षा सही ढंग से संकलित हो सकती है।

आशा है कि ये आपकी मदद करेगा।


48

यदि आवश्यक हो तो हेडर फ़ाइल में आगे की घोषणा का उपयोग करें, और #importकार्यान्वयन में आपके द्वारा उपयोग किए जा रहे किसी भी वर्ग के लिए हेडर फाइलें। दूसरे शब्दों में, आप हमेशा #importअपने कार्यान्वयन में जिन फ़ाइलों का उपयोग कर रहे हैं, और यदि आपको अपनी हेडर फ़ाइल में एक वर्ग को संदर्भित करने की आवश्यकता है तो आगे की घोषणा का भी उपयोग करें।

इसका अपवाद यह है कि आपको #importएक क्लास या औपचारिक प्रोटोकॉल चाहिए जो आप अपनी हेडर फ़ाइल से प्राप्त कर रहे हैं (जिस स्थिति में आपको इसे कार्यान्वयन में आयात करने की आवश्यकता नहीं होगी)।


24

हेडर फ़ाइलों में सामान्य अभ्यास @क्लास का उपयोग कर रहा है (लेकिन आपको अभी भी # सुपरपोर्ट को #import करने की आवश्यकता है), और कार्यान्वयन फ़ाइलों में #import। यह किसी भी परिपत्र समावेश से बच जाएगा, और यह सिर्फ काम करता है।


2
मुझे लगा कि #import #Include से बेहतर था कि यह केवल एक उदाहरण का आयात करता है?
मैथ्यू Schinckel

2
सच। पता नहीं कि यह सर्कुलर इन्क्लूजन या गलत ऑर्डरिंग के बारे में है, लेकिन मैं उस नियम से दूर हो गया (हेडर में एक आयात के साथ, सबक्लास के कार्यान्वयन में आयात की आवश्यकता नहीं थी), और जल्द ही यह वास्तव में गड़बड़ हो गया। निचला रेखा, उस नियम का पालन करें, और कंपाइलर खुश होगा।
स्टीफ थिरियन नोव 27'08

1
वर्तमान डॉक्स का कहना है कि #import", सी # शामिल निर्देश की तरह है सिवाय इसके कि यह सुनिश्चित करें कि एक ही फाइल एक बार से अधिक शामिल नहीं किया जाता है।" इसलिए इसके अनुसार #importपरिपत्र निष्कर्षों का ध्यान रखा जाता है, @classनिर्देश विशेष रूप से मदद नहीं करते हैं।
एरिक

24

एक और लाभ: त्वरित संकलन

यदि आप एक हेडर फ़ाइल शामिल करते हैं, तो इसमें कोई भी परिवर्तन वर्तमान फ़ाइल को संकलित करने का कारण बनता है, लेकिन यदि क्लास नाम को शामिल किया गया है, तो यह मामला नहीं है @class name। बेशक आपको हेडर को सोर्स फाइल में शामिल करना होगा


18

मेरी पूछताछ यही है। कब कोई #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>)। यह निर्भरता का परिचय दे सकता है, लेकिन पुस्तकालय अनुरक्षक अक्सर आपके लिए आवश्यकतानुसार भौतिक निर्भरता को संभाल सकते हैं - यदि वे एक विशेषता का परिचय देते हैं, तो वे आपके निर्माण पर पड़ने वाले प्रभाव को कम कर सकते हैं।


BTW चीजों को समझाने का अच्छा प्रयास। .लेकिन वे काफी जटिल प्रतीत होते हैं।
अजय शर्मा

NSObject types are never values -- NSObject types are always reference counted pointers.पूरी तरह से सच नहीं है। ब्लॉक आपके जवाब में एक खामियाजा कहते हैं, बस कह रहे हैं।
रिचर्ड जे। रॉस III

@ RichardJ.RossIII… और GCC मूल्यों को घोषित करने और उपयोग करने की अनुमति देता है, जबकि क्लैंग इसे मना करता है। और हां, पॉइंटर के पीछे एक मूल्य होना चाहिए।
जस्टिन

11

मैं बहुत सारे "इसे इस तरह करता हूं" देखता हूं, लेकिन मुझे "क्यों" का कोई जवाब नहीं दिखता है?

इसलिए: आपको अपने शीर्ष लेख और # कार्यान्वयन में @क्लास ही क्यों करना चाहिए? आप हर समय @class और #import पर जाकर अपने काम को दोगुना कर रहे हैं । जब तक आप वंशानुक्रम का उपयोग नहीं करते। जिस स्थिति में आप एक एकल @ वर्ग के लिए कई बार #importing करेंगे। फिर आपको कई अलग-अलग फ़ाइलों से निकालने के लिए याद रखना होगा यदि आप अचानक तय करते हैं कि आपको अब एक घोषणा तक पहुंच की आवश्यकता नहीं है।

एक ही फ़ाइल को कई बार आयात करना #import की प्रकृति के कारण कोई समस्या नहीं है। संकलन प्रदर्शन वास्तव में एक मुद्दा नहीं है। यदि ऐसा होता है, तो हम कोको / कोको.ह या # बहुत अधिक हर हेडर फ़ाइल जो हमारे पास है, को #importing नहीं करेंगे।


1
एक उदाहरण के लिए ऊपर दिए गए अबिज़म के उत्तर को देखें कि आपको ऐसा क्यों करना चाहिए। जब आपके पास दो क्लास हेडर होते हैं तो एक दूसरे के उदाहरण चर के साथ एक दूसरे को आयात करने के लिए इसकी रक्षात्मक प्रोग्रामिंग।
जैकस्लैश

7

अगर हम ऐसा करते हैं

@interface Class_B : Class_A

इसका अर्थ है कि हम Class_A को Class_B में इनहेरिट कर रहे हैं, Class_B में हम class_A के सभी वेरिएबल्स तक पहुँच सकते हैं।

अगर हम ऐसा कर रहे हैं

#import ....
@class Class_A
@interface Class_B

यहाँ हम कह रहे हैं कि हम अपने प्रोग्राम में Class_A का उपयोग कर रहे हैं, लेकिन यदि हम Class_A में Class_A वेरिएबल्स का उपयोग करना चाहते हैं, तो हमें .m file में #import Class_A फाइल करना होगा (एक ऑब्जेक्ट बनाएं और इसे फ़ंक्शन और वेरिएबल्स का उपयोग करें)।


5

फ़ाइल निर्भरता और #import & @class के बारे में अतिरिक्त जानकारी के लिए इसे देखें:

http://qualitycoding.org/file-d dependencies/ itis अच्छा लेख

लेख का सारांश

हेडर फ़ाइलों में आयात:

  • # उस सुपरक्लास का निर्माण करें जो आप विरासत में प्राप्त कर रहे हैं, और जो प्रोटोकॉल आप कार्यान्वित कर रहे हैं।
  • फ़ॉरवर्ड-डिक्लेयर बाकी सब (जब तक कि यह एक मास्टर हेडर के साथ एक फ्रेमवर्क से नहीं आता है)।
  • अन्य सभी #imports को समाप्त करने का प्रयास करें।
  • निर्भरता कम करने के लिए अपने स्वयं के हेडर में प्रोटोकॉल घोषित करें।
  • बहुत आगे की घोषणाएं? आपके पास एक बड़ा वर्ग है।

कार्यान्वयन फ़ाइलों में आयात:

  • उपयोग नहीं किए गए cruft #imports को हटा दें।
  • यदि कोई विधि किसी अन्य ऑब्जेक्ट को प्रस्तुत करती है और वह वापस मिलती है, तो उस ऑब्जेक्ट को #importing करने के बजाय अग्रेषित-घोषित करने का प्रयास करें।
  • यदि एक मॉड्यूल शामिल है जो आपको लगातार निर्भरता के स्तर के बाद के स्तर को शामिल करने के लिए मजबूर करता है, तो आपके पास उन वर्गों का एक समूह हो सकता है जो पुस्तकालय बनना चाहते हैं। मास्टर हेडर के साथ एक अलग लाइब्रेरी के रूप में इसका निर्माण करें, इसलिए सब कुछ एक ही प्रीबिल्ट चंक के रूप में लाया जा सकता है।
  • बहुत सारे #imports? आपके पास एक बड़ा वर्ग है।

3

जब मैं विकसित होता हूं, तो मेरे दिमाग में केवल तीन चीजें होती हैं जो मुझे कभी भी परेशान नहीं करती हैं।

  1. सुपर क्लास आयात करें
  2. माता-पिता की कक्षाएं आयात करें (जब आपके बच्चे और माता-पिता हों)
  3. अपनी परियोजना के बाहर आयात कक्षाएं (जैसे चौखटे और पुस्तकालयों में)

अन्य सभी वर्गों के लिए (मेरी परियोजना स्वयं में उपवर्ग और बच्चे वर्ग), मैं उन्हें फॉरवर्ड-क्लास के माध्यम से घोषित करता हूं।


3

यदि आप अपनी हेडर फ़ाइल में एक चर, या एक संपत्ति घोषित करने की कोशिश करते हैं, जिसे आपने अभी तक आयात नहीं किया है, तो आपको यह कहते हुए एक त्रुटि मिलती है कि संकलक इस वर्ग को नहीं जानता है।

आपका पहला विचार शायद यही #importहै।
इससे कुछ मामलों में समस्या हो सकती है।

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

इसलिए आप संकलक के साथ बता सकते हैं @class:

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

यह मूल रूप से कंपाइलर को बंद करने और संकलित करने के लिए कहता है, भले ही यह सुनिश्चित न हो कि क्या यह वर्ग कभी लागू होने जा रहा है।

आप आम तौर पर इस्तेमाल करेगा #importमें मीटर और @classमें फ़ाइलें।


0

केवल कंपाइलर को त्रुटि दिखाने से रोकने के लिए आगे की घोषणा।

संकलक को पता चल जाएगा कि घोषित करने के लिए आपकी हेडर फ़ाइल में आपके द्वारा उपयोग किए गए नाम के साथ वर्ग है।


क्या आपके द्वारा कुछ अधिक विशिष्ट हुआ जा सकता है?
सैम स्पेंसर

0

कंपाइलर केवल तभी शिकायत करेगा जब आप उस वर्ग का इस तरह से उपयोग करने जा रहे हैं, ताकि कंपाइलर को इसके कार्यान्वयन की जानकारी हो।

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

  1. यह ऐसा हो सकता है यदि आप अपनी कक्षा को इससे प्राप्त करने जा रहे हैं या
  2. यदि आप सदस्य चर (हालांकि दुर्लभ) के रूप में उस वर्ग की एक वस्तु रखने जा रहे हैं।

यह शिकायत नहीं करेगा यदि आप इसे एक पॉइंटर के रूप में उपयोग करने जा रहे हैं। बेशक, आपको इसे कार्यान्वयन फ़ाइल में #import करना होगा (यदि आप उस वर्ग की किसी वस्तु को इंस्टेंट कर रहे हैं) क्योंकि किसी ऑब्जेक्ट को इंस्टेंट करने के लिए कक्षा की सामग्री को जानना आवश्यक है।

नोट: #import #include के समान नहीं है। इसका मतलब है कि परिपत्र आयात नाम की कोई चीज नहीं है। कुछ जानकारी के लिए कंपाइलर किसी विशेष फ़ाइल को देखने के लिए आयात एक अनुरोध है। यदि वह जानकारी पहले से उपलब्ध है, तो संकलक इसे अनदेखा कर देता है।

बस यह कोशिश करो, आह में भू और भ में आह आयात करें कोई समस्या या शिकायत नहीं होगी और यह ठीक भी काम करेगा।

@क्लास का उपयोग कब करना है

आप @class का उपयोग केवल तभी करते हैं जब आप अपने हेडर में हेडर आयात नहीं करना चाहते। यह एक ऐसा मामला हो सकता है जहां आपको यह जानने की भी परवाह नहीं है कि वह वर्ग क्या होगा। ऐसे मामले जहाँ आपके पास अभी तक उस वर्ग के लिए हेडर नहीं है।

इसका एक उदाहरण यह हो सकता है कि आप दो पुस्तकालय लिख रहे हैं। एक वर्ग, इसे A कहते हैं, एक पुस्तकालय में मौजूद है। इस लाइब्रेरी में दूसरी लाइब्रेरी का हेडर शामिल है। उस हेडर में A का पॉइंटर हो सकता है लेकिन फिर से उसे उपयोग करने की आवश्यकता नहीं हो सकती है। यदि लाइब्रेरी 1 अभी तक उपलब्ध नहीं है, तो यदि आप @क्लास का उपयोग करते हैं तो लाइब्रेरी बी ब्लॉक नहीं किया जाएगा। लेकिन अगर आप आह आयात करना चाह रहे हैं, तो पुस्तकालय 2 की प्रगति अवरुद्ध है।


0

संकलक के रूप में @class के बारे में सोचो "मुझ पर विश्वास करो, यह मौजूद है"।

#Import को कॉपी-पेस्ट समझें।

आप कई कारणों से आपके द्वारा आयात की संख्या को कम से कम करना चाहते हैं। किसी भी शोध के बिना, पहली बात जो मन में आती है वह संकलन समय को कम करती है।

ध्यान दें कि जब आप एक वर्ग से विरासत में प्राप्त करते हैं, तो आप केवल एक आगे की घोषणा का उपयोग नहीं कर सकते। आपको फ़ाइल आयात करने की आवश्यकता है, ताकि जिस वर्ग की आप घोषणा कर रहे हैं, वह जानता हो कि यह कैसे परिभाषित है।


0

यह एक उदाहरण परिदृश्य है, जहां हमें @class की आवश्यकता है।

विचार करें कि क्या आप हेडर फ़ाइल के भीतर एक प्रोटोकॉल बनाना चाहते हैं, जिसमें एक ही वर्ग के डेटा प्रकार के साथ एक पैरामीटर है, तो आप @class का उपयोग कर सकते हैं। कृपया याद रखें कि आप अलग से प्रोटोकॉल भी घोषित कर सकते हैं, यह केवल एक उदाहरण है।

// DroneSearchField.h

#import <UIKit/UIKit.h>
@class DroneSearchField;
@protocol DroneSearchFieldDelegate<UITextFieldDelegate>
@optional
- (void)DroneTextFieldButtonClicked:(DroneSearchField *)textField;
@end
@interface DroneSearchField : UITextField
@end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.