2012-11-14 7 views
7

मैं मूल रूप से एक्सकोड 4.0 में निर्मित एक प्रोजेक्ट पर काम कर रहा हूं, और फिर XCode 4.2 का उपयोग करने के लिए माइग्रेट किया गया। अब मैं XCode 4.5 की ओर पलायन बाहर परीक्षण किया है, और मैं नीचे की तरह चेतावनियों की एक टन हो रही है ...एक्सकोड 4.5 माता-पिता/बाल कक्षाओं के लिए श्रेणियों के बीच विधि नाम विवादों के बारे में चेतावनी देता है

instance method 'values' in category from <pathToTheFile>/HistoryObject+extras.o conflicts with same method from another category 

इन चेतावनियों XCode के पिछले संस्करणों में दिखाई दिया कभी नहीं, और कोड नहीं बदला है।

प्रोजेक्ट को तैनाती लक्ष्य के लिए आईओएस 4.3 पर सेट किया गया है।

तो, हमारे पास पिछले डेवलपर से डीएओ प्रकार के वर्गों का एक गुच्छा है जो मुझे विश्वास है कि कोरडाटा से स्वत: जेनरेट किया गया था, और फिर इनमें से प्रत्येक वर्ग में एक श्रेणी है जो इसे कुछ तरीकों को लागू करने के लिए विस्तारित करती है। मैं एक उदाहरण दूंगा ...

हमारे पास लिसा ऑब्जेक्ट नामक एक बेस क्लास है जो एनएसएमएनेज ऑब्जेक्ट से विरासत में है, और इसमें लिसा ऑब्जेक्ट + एक्स्ट्रा नामक एक श्रेणी है। लिसा ऑब्जेक्ट + एक्स्ट्रा में, "मान" नामक एक विधि है जो एक एनएसएमयूटेबल डिक्शनरी देता है।

हमारे पास इतिहासऑब्जेक्ट नामक एक कक्षा है जो लिसा ऑब्जेक्ट से प्राप्त होती है। HistoryObject के लिए एक श्रेणी भी है जिसे HistroyObject + Extras नाम दिया गया है। इस श्रेणी में "मान" नामक एक विधि भी है। HistoryObject + अतिरिक्त मूल्य विधि में, यह [सुपर मान] को कॉल करता है, और उसके बाद कुछ स्थितियों के लिए जांच करता है और बेस क्लास विधि में सेट नहीं होने वाले शब्दकोश में कुछ अतिरिक्त मान सेट करता है।

हमारे पास LessonStatusObject नामक एक वर्ग है जो हिस्ट्रीऑब्जेक्ट से विरासत में है, और इसमें भी LessonStatusObject + Extras नामक एक श्रेणी है, जिसमें मूल्यों का नाम है। यह मान विधि [सुपर वैल्यू] भी कॉल करती है और फिर लौटाई गई शब्दकोश पर कुछ अतिरिक्त काम करती है।

इनमें से प्रत्येक "मूल्य" विधियों के लिए, हमें ऊपर दिखाए गए जैसा संकलन समय पर एक चेतावनी मिलती है जहां यह कहता है कि श्रेणी में विरोधाभासी नाम के साथ एक विधि है।

मेरे पास इसके बारे में कुछ प्रश्न हैं।

पहला, क्या यह कार्यान्वयन किसी भी वैध समस्या का कारण बन सकता है, या ये चेतावनियां आमतौर पर सौम्य हैं? मैंने यह सोचने की कोशिश की है कि यह कार्यान्वयन रनटाइम पर अस्पष्टता का कारण बन सकता है, लेकिन मुझे नहीं लगता कि यह कैसे हो सकता है।

दूसरा, क्या ऐसा कुछ है जो मुझे इन चेतावनियों को ठीक करने के लिए करना चाहिए (और मेरा मतलब यह नहीं है कि उन्हें केवल दिखाना बंद कर दें; मेरा मतलब है कारण को ठीक करना)? क्या कोई और तरीका है जिसके बारे में हमें इस बारे में जाना चाहिए?

इसके अलावा, एक्सकोड 4.2 इस बारे में चेतावनी क्यों नहीं देगा, लेकिन एक्सकोड 4.5 चेतावनी देता है?

क्या मैं श्रेणियों के बारे में कुछ गलत समझ रहा हूं? मेरा मतलब है, अगर "मूल्य" विधि वास्तव में प्रत्येक वर्ग कार्यान्वयन का हिस्सा थी, तो हम उन्हें जिस तरीके से ओवरराइड करने में कोई समस्या नहीं होगी, लेकिन संकलक बस शिकायत कर रहा है क्योंकि ये श्रेणियां हैं। क्या इस बारे में कुछ भी असुरक्षित है?

किसी भी सलाह की बहुत सराहना की जाती है।

संपादित करें: बस अधिक जानकारी प्रदान करने के लिए ... जब हम एक्सकोड 4.2 का उपयोग कर रहे थे, तो परियोजना में एप्पल एलएलवीएम कंपाइलर 3.0 पर संकलक सेट किया गया था। अब जब मैं एक्सकोड 4.5 में प्रोजेक्ट खोलता हूं, तो इसमें ऐप्पल एलएलवीएम कंपाइलर 4.1 पर संकलक सेट है।

+0

कृपया आईडीई (एक्सकोड) और कंपाइलर (क्लैंग, मैं मान रहा हूं) के बीच अंतर करना सीखें। संकलक वह आपको चेतावनी देता है, न कि एक्सकोड। एक्सकोड सिर्फ सामने वाला अंत है। –

उत्तर

4

चेतावनी को अनदेखा न करें।

गाइड एप्पल के "ऑब्जेक्टिव-सी के साथ प्रोग्रामिंग", "Customizing Existing Classes" खंड में, कहते हैं:

तो एक विधि एक वर्ग में घोषित के नाम मूल कक्षा में एक विधि रूप में ही है , या कक्षा (या यहां तक ​​कि एक सुपरक्लास) पर किसी अन्य श्रेणी में एक विधि, व्यवहार को परिभाषित किया गया है कि विधि कार्यान्वयन रनटाइम पर उपयोग किया जाता है।

यदि यह आपके लिए काम कर रहा है, तो यह भाग्य है।

+0

मैं समझ सकता हूं कि एक ही कक्षा में दो श्रेणियों के साथ एक अस्पष्टता कैसे मौजूद होगी, दोनों में एक ही विधि का नाम है। मैं नहीं देखता कि कैसे एक अस्पष्टता मौजूद होगी जब एक सुपरक्लास और उप-वर्ग में दो अलग-अलग श्रेणियां होती हैं जिनकी विधियां होती हैं। एक सामान्य उदाहरण विधि को ओवरराइड करने से कोई अलग कैसे है? क्या आप कृपया बता सकते हैं कि श्रेणियों के लिए कोई अंतर है जो अस्पष्टता का कारण बन सकता है? – Jim

+0

मैं वास्तव में विशेष रूप से नहीं जानता कि व्यवहार अपरिभाषित क्यों है, इसलिए मैं ऐप्पल के दस्तावेज़ों को रोकता हूं। निश्चित रूप से मुझे यह जानने में दिलचस्पी होगी कि क्यों, खुद। –

+0

उत्तर के लिए धन्यवाद। फिर भी, मैं वास्तव में जानना चाहता हूं कि इन सभी चेतावनियों को ठीक करने के लिए बड़े बदलाव करना आवश्यक है यदि रनटाइम पर वैध अस्पष्टता का कोई कारण नहीं हो सकता है। यह स्पष्ट है कि एक ही विधि के समान वर्ग के दो श्रेणियों में अस्पष्टता क्यों होगी, लेकिन यह समझ में नहीं आता कि दो अलग-अलग वर्गों पर दो श्रेणियां क्यों माता-पिता/बच्चे कभी अस्पष्टता पैदा कर सकती हैं। यह सिर्फ समझ में नहीं आता है; प्रत्येक वर्ग में अपना स्वयं का तरीका होता है, और यदि बच्चे को नाम दिया जाता है तो बच्चे को माता-पिता को ओवरराइड करना चाहिए। श्रेणियों का उपयोग कैसे बदलता है? – Jim

28

मुझे यह वही परेशानी का मुद्दा था और यह पता चला कि मैंने गलती से उस श्रेणी की .m फ़ाइल को मेरे वीसी कोड में से एक में .h फ़ाइल में शामिल किया था। .h फ़ाइल में इसे सुधारने से लिंकर चेतावनियां हटा दी गईं।

+0

सुझाव के लिए धन्यवाद, मैं यह सुनिश्चित करने के लिए जांच करूँगा कि समस्या नहीं है। – Jim

+6

यह मेरे साथ भी हुआ। मैं किसी और को सुझाव देता हूं जो यह देखता है कि यह स्ट्रिंग '.m' 'के लिए अपनी पूरी परियोजना को खोजता है। –

0

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

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