2012-09-13 9 views
18

मैं आईओएस प्रोजेक्ट पर ऐपडिलेगेट में कई अलग-अलग वर्गों के लिए सामान्य तरीकों और परिभाषाओं के साथ मदद कर रहा हूं। तो, उन वर्गों में से प्रत्येक में, .h फ़ाइल में, मैं #import "AppDelegate.h" का उपयोग करता हूं। यह तब तक ठीक काम करता है जब तक मुझे उन वर्गों में से किसी एक तक पहुंच की आवश्यकता न हो जो ऐपडिलेगेट को पहले से ही आयात करता है जो ऐपडिलेगेट आयात करता है। इस बिंदु पर, मुझे AppDelegate के लिए एक डुप्लिकेट इंटरफ़ेस परिभाषा त्रुटि मिलती है।"डुप्लिकेट इंटरफेस परिभाषा" त्रुटि प्राप्त करना, निश्चित रूप से # हेडर फाइलों को आयात करना है

ठीक है, तो यह उचित लगता है। मैं पहले से ही एक फाइल में ऐपडिलेगेट आयात कर रहा हूं जिसे मैं आयात कर रहा हूं, इसलिए ऐपडिलेगेट दो अलग-अलग स्थानों से आयात किया जा रहा है। तो मैं ऐपडिलेगेट लाइन को हटा देता हूं, और सबकुछ ठीक है।

लेकिन क्या होता है जब मुझे दो कक्षाओं को आयात करने की आवश्यकता होती है जिन्हें दोनों को AppDelegate आयात करने की आवश्यकता होती है?

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

मेरे पास ClassA.h, ClassB.h, और ClassC.h है। सभी #import "AppDelegate.h" है। जब मुझे कक्षा में #import "ClassB.h" का उपयोग करने की आवश्यकता है, तो मैं कक्षा से #import "AppDelegate.h" पंक्ति को हटा देता हूं। सब कुछ सुचारू रूप से काम करता है। लेकिन क्या होगा यदि मुझे क्लास में "क्लाससीएच" को # आयात करने की भी आवश्यकता है, और क्लासबी और क्लाससी को #import "AppDelegate.h" की आवश्यकता है?

संपादित करें:

मैं सटीक परिदृश्य मैं एक साफ परियोजना में ऊपर वर्णित की कोशिश की, और यह ठीक बनाया, इसलिए वहाँ खेल में कुछ और ही है। लेकिन मैं निश्चित रूप से क्या कह सकता हूं कि जब यह समस्या पहले इस परियोजना के साथ आई थी, तो यह ऐपडिलेगेट की एक डुप्लिकेट इंटरफ़ेस परिभाषा थी, और जब मैंने #import "AppDelegate.h" पंक्ति को हटा दिया, तो त्रुटि दूर हो गई, और मैं अभी भी अन्य आयातित फ़ाइलों के माध्यम से AppDelegate.h विधियों और enums तक पहुंच थी।

+0

क्या आप वाकई '# import' का उपयोग करते हैं और '# शामिल नहीं' करते हैं? '# import' को एक ही हेडर फ़ाइल को दो बार आयात करने के लिए डिज़ाइन नहीं किया गया है, इसलिए यह तार्किक प्रतीत नहीं होता है कि कंपाइलर #import" AppDelegate.h "दो बार – AliSoftware

+0

100% सुनिश्चित है। मेरे Google शोध ने वही बात कहा है। मेरे पास अतीत में एक समान समस्या है, जिसे मैं .h के बजाय .m में फ़ाइल समेत ठीक करने में सक्षम था, लेकिन दुर्भाग्यवश, मुझे आयात करने में आयातित फ़ाइल में एक enum तक पहुंच की आवश्यकता है। एच, तो यह एक विकल्प नहीं है। – CowGoes

+1

लेकिन मैंने अभी नीचे वर्णित परिदृश्य के साथ नमूना ऐप बनाया है, और यह काम करता है। तो मुझे लगता है कि यहाँ खेलने पर कुछ और है। लेकिन मैं निश्चित रूप से क्या कह सकता हूं कि जब यह मुद्दा अतीत में आया था, तो यह ऐपडिलेगेट की एक डुप्लिकेट इंटरफ़ेस परिभाषा थी, और जब मैंने #import "AppDelegate.h" पंक्ति को हटा दिया, तो त्रुटि दूर हो गई, और मेरे पास अभी भी था अन्य आयातित फ़ाइलों के माध्यम से AppDelegate.h विधियों और enums तक पहुंच। – CowGoes

उत्तर

26

इसके लिए सबसे अच्छी रोकथाम और इलाज हेडर फ़ाइल से आयात करने के लिए कुछ दिशानिर्देशों का पालन करना है। एक सामान्य नियम के रूप में, इन मामलों को छोड़कर किसी उद्देश्य-सी शीर्षलेख से कभी आयात न करें:

  1. आपको किसी अन्य शीर्षलेख में घोषित कक्षा का विस्तार करने की आवश्यकता है।
  2. आपको किसी अन्य शीर्षलेख में घोषित प्रोटोकॉल के साथ अनुरूपता घोषित करने की आवश्यकता है।
  3. आपको सार्वजनिक विधियों और/या गुणों में किसी अन्य शीर्षलेख में परिभाषित एक गैर-वर्ग, गैर-प्रोटोकॉल प्रकार का संदर्भ देना होगा। प्रोटोकॉल और कक्षाओं का उल्लेख करने के लिए, आगे, @class या @protocol के साथ उन्हें घोषित की तरह @class ClassFromOtherHeader;

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

+0

दिशानिर्देशों के इन सेटों के लिए धन्यवाद। वे जानना निश्चित रूप से सहायक हैं। मैंने कोड को साफ़ कर लिया और साफ़ कर दिया, और ज्यादातर मामलों में, मैं #mports की एक महत्वपूर्ण संख्या को एमएम में स्थानांतरित करने में सक्षम था। हालांकि, मैं पूरी तरह से समस्या का समाधान करने में सक्षम नहीं था।परिभाषित करने की आवश्यकता के कारण लगभग हर वर्ग को AppDelegate.h और दो अन्य वर्गों को आयात करने की आवश्यकता होती है। बिल्डिंग के परिणामस्वरूप एपडिलेगेट के लिए पॉप-अप करने वाली एक ही डुप्लिकेट इंटरफ़ेस परिभाषा त्रुटियां हुईं। यह मेरे लिए हुआ कि AppDelegate.h आयात करने वाली इनमें से कुछ फ़ाइलें AppDelegate.m में आयात की गई हैं। क्या यह समस्या हो सकती है? – CowGoes

+0

@CowGoes आपका स्वागत है, और यह समस्या का हिस्सा हो सकता है। यह भी दो बार जांचें कि आप गलती से कहीं भी '# शामिल' का उपयोग नहीं कर रहे हैं। मैंने आगे की घोषणा के बारे में अधिक विशिष्ट होने के लिए अपना उत्तर अपडेट किया - अपनी अगली घोषणाओं के साथ निर्दयी रहें। क्या आप सभी किसी भी संस्करण नियंत्रण का उपयोग कर रहे हैं जहां आप अपने परिवर्तनों को देख सकते हैं और इस बात को कम कर सकते हैं कि किस विशेष आयात निर्देश ने इस मुद्दे को पेश किया? –

+0

मैंने वास्तव में समस्या को हल किया - यह पता चला कि वास्तव में परियोजना में शामिल एक और AppDelegate.h था। मेरे सामने इस परियोजना पर काम करने वाला लड़का अन्य परियोजनाओं से चीजों की प्रतिलिपि बना रहा है, मुझे लगता है। लेकिन मुझे लगता है कि यह छिपाने में एक आशीर्वाद था, क्योंकि अब मैं कार्यान्वयन बनाम हेडर फाइलों में आयात करने के लिए उचित प्रोटोकॉल जानता हूं। – CowGoes

0

Fwiw मैं इसे यादृच्छिक रूप से याद कर रहा था - मेरे लिए फिक्स Product->Clean करना था और यह जादुई रूप से चला गया।

19

मेरे लिए उपरोक्त में से कोई भी उत्तर मदद नहीं कर रहा था, न ही जवाब here दिया गया था।

मेरे लिए यह तय किया गया कि यह एक्सकोड बंद कर रहा था, ~/लाइब्रेरी/डेवलपर/एक्सकोड/व्युत्पन्न डेटा पर जा रहा था और इस परियोजना से जुड़े सभी व्युत्पन्न डेटा को हटा रहा था। उसके बाद मैंने परियोजना को फिर से खोल दिया और यह ठीक काम कर रहा था।

आशा है कि किसी को मदद करता है!

+1

एक ही समस्या थी, और यह एकमात्र समाधान था जो मेरे लिए काम करता था। फाइंडर में फ़ाइलों के समूह को घुमाने और फिर एक्सकोड प्रोजेक्ट को अपडेट करने के बाद समस्या बढ़ी। –

+0

यह मेरे लिए काम किया। मैंने myfile.o नाम के साथ सभी फाइलों को हटा दिया है, जहां Myfile .h फ़ाइल का नाम है जहां चेतावनी हुई: –

+0

@poff, इसने आईओएस 9 पर अपने सरल प्रोजेक्ट के लिए अपना बदसूरत सिर उठाया - और आपका फिक्स अभी भी काम करता है। धन्यवाद – user3741598

3

मेरे मामले में, किसी भी समाधान का उल्लेख इस मुद्दे को हल नहीं करता है। एक्सकोड स्विफ्ट में एक वर्ग के लिए एक डुप्लिकेट इंटरफेस की रिपोर्ट कर रहा था। किसी भी तरह से वह उस वर्ग के लिए उद्देश्य-सी हेडर फ़ाइल में खींच रहा था जिसे सीधे परियोजना में संदर्भित नहीं किया गया था। grep -nr ProblemClassName.h .

यह पता चला कि ब्रिजिंग हैडर एक अप्रचलित फ़ाइल है कि नहीं था शामिल:

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

tl; dr ब्रिजिंग हेडर को दोबारा जांचें ताकि यह सुनिश्चित किया जा सके कि वहां आयात की जाने वाली सभी फाइलें वहां हों और हेडर आयात न करें जो बदले में हेडर आयात कर रहे हों।

1

मैंने पाया कि एक परियोजना एक subproject था और बजाय संदर्भित उचित सिंटैक्स साथ subproject में शामिल:

#import <SubProject/Filename.h> 

यह सीधे उन्हें

#import <Filename.h> 

का आयात किया गया था इस कारण ही संभव था उपप्रोजेक्ट का मार्ग मुख्य प्रोजेक्ट के "हेडर सर्च पथ" में शामिल किया गया था - जो व्यवसाय करने का गलत तरीका है। तो मैंने इसे वहां से हटा दिया। उपप्रोजेक्ट को "अंतर्निहित चरणों - प्रतिलिपि फ़ाइलों" अनुभाग (जो वास्तव में पहले से ही हो रहा था) में आवश्यक शामिल फ़ाइलों की प्रतिलिपि बनाना चाहिए, और सबप्रोजेक्ट/फ़ाइल नाम एच वाक्यविन्यास का उपयोग करने वाले आयात का उचित रूप उपयोग किया जाना चाहिए।

0

मेरे लिए, मैं एम फ़ाइल में इंटरफ़ेस परिभाषा में ब्रांड्स को शामिल करना भूल गया।

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