दिलचस्प पोस्ट
\ w और \ b नियमित अभिव्यक्ति मेटा वर्णों में अंतर डेटटाइम से वारकर को कैसे परिवर्तित करें एक तारीख में मिलीसेकंड परिवर्तित (jQuery / JS) Var कीवर्ड के बिना चर घोषित करना मैं फाइल स्थान प्रोग्राम को कैसे बदल सकता हूं? LEFT OUTER SQL सर्वर में जुड़ें जीआईटी-एलएस-ट्री के आउटपुट के मोड फ़ील्ड को कैसे पढ़ा जाए सबसे कुशल टी-एसक्यूएल का रास्ता एक निश्चित लंबाई के लिए बाईं तरफ एक varchar पैड? जावा का उपयोग करके लाइन से एक बड़ी टेक्स्ट फ़ाइल लाइन कैसे पढ़ी जा सकती है? आईफ़ोन 6 और 6 प्लस मीडिया क्वेरीज़ एक पिक्सेल संपादक के लिए ग्रिड का एक प्रकार चाहते हैं जेएसएफ़ ढांचे में जेएक्स-आरएस रेस्तुअल सेवा को लागू कैसे करें jQuery: कस्टम विशेषता के साथ सभी तत्व का चयन करें कैसे एक नोड। Js आवेदन स्थायी रूप से चलाने के लिए? फ़ाइल सार्वभौमिक (तीन स्लाइसें) है, लेकिन इसमें आईओएस पर स्थैतिक पुस्तकालयों के लिए एआरएमवी 7-एस टुकड़ा त्रुटि शामिल नहीं है, वैसे भी बायपास करने के लिए?

उद्देश्य सी नाम स्थान की टक्कर को हल करने का सबसे अच्छा तरीका क्या है?

उद्देश्य-सी में कोई नाम स्थान नहीं है; यह सी की तरह बहुत कुछ है, सब कुछ एक वैश्विक नाम स्थान के भीतर है। सामान्य अभ्यास प्रारंभिक अक्षर के साथ कक्षाएं उपसर्ग करना है, उदाहरण के लिए यदि आप आईबीएम में काम कर रहे हैं, तो आप उन्हें "आईबीएम" के साथ उपसर्ग कर सकते हैं; यदि आप Microsoft के लिए काम करते हैं, तो आप "एमएस" का उपयोग कर सकते हैं; और इसी तरह। कभी-कभी आरंभिक प्रोजेक्ट का संदर्भ मिलता है, जैसे "ऐ" के साथ Adium उपसर्ग वर्ग (जैसा कि इसके पीछे कोई कंपनी नहीं है जिसके तहत आप पहले अक्षर ले सकते थे)। ऐप्पल एनएस के साथ कक्षाएं लगाता है और कहता है कि यह उपसर्ग केवल ऐप्पल के लिए आरक्षित है

अब तक इतनी अच्छी तरह से लेकिन सामने से एक वर्ग के नाम पर 2 से 4 अक्षरों को जोड़ना एक बहुत, बहुत ही सीमित नाम स्थान है। उदाहरण के लिए एमआईएस या एआई का एक अलग अर्थ हो सकता है (एआई कृत्रिम इंटेलिजेंस उदाहरण के लिए हो सकता है) और कुछ अन्य डेवलपर इसका इस्तेमाल करने का फैसला कर सकते हैं और समान रूप से नामित वर्ग बना सकते हैं। बैंग , नाम स्थान टक्कर

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

सी में आप लाइब्रेरी से सीधे लिंक न किए जा सकते हैं, बजाय आप रनटाइम पर लाइब्रेरी लोड करें, dlopen () का उपयोग करके, उस प्रतीक को ढूंढें, जिसे आप dlsym () का उपयोग करने के लिए देख रहे हैं और इसे एक वैश्विक प्रतीक के रूप में प्रदान करें (जो कि आप किसी भी तरह से आपको पसंद कर सकते हैं) और फिर इस वैश्विक प्रतीक के माध्यम से इसे एक्सेस करें। उदाहरण के लिए यदि आपके पास कोई संघर्ष है क्योंकि कुछ सी लाइब्रेरी में खुले () नाम का एक फ़ंक्शन है, तो आप अपना नाम नामित एक चर परिभाषित कर सकते हैं और पुस्तकालय के खुले () फ़ंक्शन को इंगित कर सकते हैं, इस प्रकार जब आप सिस्टम को खुली () , आप केवल खुली () का उपयोग करते हैं और जब आप दूसरे का उपयोग करना चाहते हैं, तो आप इसे अपनेऑनलाइन पहचानकर्ता के माध्यम से एक्सेस करते हैं।

क्या उद्देश्य-सी में कुछ ऐसा ही संभव है और यदि नहीं, तो क्या कोई अन्य चालाक, मुश्किल समाधान है जो आप नामों के हल के हल का उपयोग कर सकते हैं? कोई विचार?


अद्यतन करें:

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

वेब के समाधान से एकत्रित समाधान "उद्देश्य सी नाम स्थान की टक्कर को हल करने का सबसे अच्छा तरीका क्या है?"

यदि आपको एक ही समय में दोनों चौखटे से कक्षाओं का उपयोग करने की आवश्यकता नहीं है, और आप प्लेटफार्मों को लक्षित कर रहे हैं जो NSBundle उतराई (ओएस एक्स 10.4 या बाद में, कोई GNUStep समर्थन नहीं) का समर्थन करता है, और प्रदर्शन वास्तव में आपके लिए कोई समस्या नहीं है, मुझे विश्वास है कि जब आप इसे से एक वर्ग का उपयोग करने के लिए हर बार एक फ्रेमवर्क लोड कर सकते हैं, और फिर इसे अनलोड और दूसरे फ्रेम को लोड करने के लिए दूसरे को लोड करें

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

एक प्रतिलिपि द्वारा इंगित किए गए डेटा की प्रतिलिपि बनाने का एक तरीका था, तो आपको एक क्लास की प्रतिलिपि या नाम बदलने की आवश्यकता नहीं होगी। आप एक नया वर्ग बना सकते हैं और फिर आइवर, विधियों, गुणों और श्रेणियों से कॉपी कर सकते हैं। अधिक काम, लेकिन यह संभव है। हालांकि, गलत क्लास को संदर्भित करने वाले ढांचे में अन्य वर्गों के साथ आपको अब भी एक समस्या होगी।

संपादित करें: सी और उद्देश्य-सी रनटाइम के बीच मूलभूत अंतर है, जैसा कि मैं समझता हूं, जब पुस्तकालयों को लोड किया जाता है, तो उन पुस्तकालयों के फ़ंक्शन में वे किसी भी प्रतीक के संकेत होते हैं, जबकि उद्देश्य-सी में, इसमें स्ट्रिंग अभ्यावेदन होते हैं thsoe प्रतीकों के नाम इस प्रकार, आपके उदाहरण में, आप स्मृति के रूप में प्रतीक का पता पाने के लिए dlsym का उपयोग कर सकते हैं और इसे दूसरे प्रतीक में संलग्न कर सकते हैं। लाइब्रेरी का दूसरा कोड अभी भी काम करता है क्योंकि आप मूल प्रतीक का पता नहीं बदल रहे हैं। उद्देश्य-सी पते की श्रेणी के नामों को मैप करने के लिए एक लुकअप तालिका का उपयोग करता है, और यह 1-1 मानचित्रण है, इसलिए आपके पास एक ही नाम के साथ दो कक्षाएं नहीं हो सकतीं इस प्रकार, दोनों वर्गों को लोड करने के लिए उनमें से एक का अपना नाम परिवर्तित होना चाहिए। हालांकि, जब अन्य वर्गों को उस नाम से कक्षाओं में से एक की आवश्यकता होती है, तो वे अपने पता के लिए लुकअप तालिका से पूछेंगे, और लुकअप तालिका मूल वर्ग के नाम को दिए गए नाम के नाम से कभी नहीं लौटाएगा।

एक अद्वितीय उपसर्ग के साथ अपनी कक्षाओं को प्रीफ़िक्स करना मौलिक रूप से एकमात्र विकल्प है, लेकिन यह कम कमजोर और बदसूरत बनाने के कई तरीके हैं यहां विकल्पों की लंबी चर्चा है मेरा पसंदीदा @compatibility_alias उद्देश्य-सी कंपाइलर निर्देश है ( यहां बताया गया है )। आप @compatibility_alias का उपयोग एक वर्ग को "नाम बदलें" करने के लिए कर सकते हैं, जिससे आप अपने वर्ग का नाम FQDN या कुछ ऐसे उपसर्ग का उपयोग कर सकते हैं:

 @interface COM_WHATEVER_ClassName : NSObject @end @compatibility_alias ClassName COM_WHATEVER_ClassName // now ClassName is an alias for COM_WHATEVER_ClassName @implementation ClassName //OK //blah @end ClassName *myClass; //OK 

एक पूरी रणनीति के भाग के रूप में, आप अपनी सभी कक्षाओं को एक विशिष्ट उपसर्ग जैसे कि @compatibility_alias साथ पहले से बना सकते हैं और फिर सभी @compatibility_alias (मुझे लगता है कि आप स्वत: जनरेटेड हैडर कहा जा सकता है) के साथ एक हेडर बनाएं।

इस तरह के उपसर्ग के नकारात्मक पक्ष यह है कि आपको किसी भी चीज़ में सही वर्ग के नाम (जैसे ऊपर दिए गए COM_WHATEVER_ClassName ) दर्ज करना होगा, जिसके लिए कंपाइलर के अलावा स्ट्रिंग से क्लास का नाम होना चाहिए विशेषकर, @compatibility_alias एक संकलक निर्देश है, एक रनटाइम फ़ंक्शन नहीं है, इसलिए NSClassFromString(ClassName) असफल (वापसी nil ) होगा – आपको NSClassFromString(COM_WHATERVER_ClassName) का प्रयोग करना होगा। इंटरफ़ेस बिल्डर nib / xib में क्लास के नामों को संशोधित करने के लिए आप बिल्ड चरण के माध्यम से ibtool उपयोग कर सकते हैं ताकि आपको पूर्ण COM_WHATEVER_… लिखना न पड़े। इंटरफ़ेस बिल्डर में।

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

कई लोग पहले से ही कुछ मुश्किल और चतुर कोड साझा कर चुके हैं जो समस्या को हल करने में मदद कर सकते हैं। कुछ सुझाव काम कर सकते हैं, लेकिन ये सभी आदर्श से कम हैं, और उनमें से कुछ को कार्यान्वित करने के लिए पूरी तरह से बुरा है (कभी-कभी बदसूरत हैक्स अपरिहार्य होते हैं, लेकिन जब भी मैं कर सकता हूं उनसे बचने की कोशिश करता हूं।) व्यावहारिक दृष्टिकोण से, यहां मेरे सुझाव हैं

  1. किसी भी स्थिति में, संघर्ष के दोनों रूपरेखाओं के डेवलपर्स को सूचित करें, और यह स्पष्ट कर दें कि इससे बचने और / या इसके साथ निपटने में आपकी असफलता आपको वास्तविक व्यापारिक समस्याएं पैदा कर रही है, जो अगर अनसुलझे अनसुलझे अगर खोई हुई व्यावसायिक आय में अनुवाद कर सकता है। जोर देते हुए कि प्रति-वर्ग के आधार पर मौजूदा संघर्षों को हल करते समय एक कम दखल तय होता है, अपने उपसर्ग को पूरी तरह से बदल रहा है (या अगर वे वर्तमान में नहीं हैं, एक का उपयोग कर रहे हैं, और उन पर शर्मिंदा!) यह सुनिश्चित करने का सबसे अच्छा तरीका है कि वे एक ही समस्या को फिर से देखें
  2. यदि नामकरण के संघर्ष क्लास के एक छोटे से छोटे सेट तक ही सीमित हैं, तो देखें कि क्या आप उन कक्षाओं के आसपास काम कर सकते हैं, खासकर यदि एक परस्पर विरोधी वर्ग आपके कोड द्वारा सीधे या अप्रत्यक्ष रूप से उपयोग नहीं किया जा रहा है। यदि हां, तो देखें कि क्या विक्रेता उस ढांचे का एक कस्टम संस्करण प्रदान करेगा, जिसमें विवादित कक्षाएं शामिल नहीं हैं यदि नहीं, तो इस तथ्य के बारे में स्पष्ट होना चाहिए कि उनकी ढलान अपने ढांचा का उपयोग करने से आपके ROI को कम कर रहे हैं। कारण के भीतर पुश होने के बारे में बुरा मत मानो – ग्राहक हमेशा सही होता है 😉
  3. अगर एक ढांचा अधिक "अपर्याप्त" होता है, तो आप इसे किसी दूसरे फ्रेमवर्क (या कोड के संयोजन) से स्थानांतरित करने पर विचार कर सकते हैं, या तो तीसरे पक्ष या होमब्रे (बाद वाला अवांछनीय खराब-मामला है, क्योंकि इसमें निश्चित रूप से विकास और रखरखाव के लिए अतिरिक्त व्यापारिक लागतें शामिल होंगी।) यदि आप करते हैं, तो उस रूपरेखा के विक्रेता को सूचित करें कि आपने उनके ढांचे का उपयोग न करने का फैसला क्यों किया।
  4. यदि दोनों फ्रेमवर्क आपके आवेदन के लिए समान रूप से अपरिहार्य मानते हैं, तो उनमें से एक को एक या एक से अधिक अलग-अलग प्रक्रियाओं के लिए उपयोग करने के तरीके का पता लगा सकते हैं, शायद डीओ के जरिए संचार करते हुए लुईस Gerbarg ने सुझाव दिया है। संचार की डिग्री के आधार पर, यह उतना बुरा नहीं है जितना आप उम्मीद कर सकते हैं। कई कार्यक्रम (QuickTime सहित, मुझे विश्वास है) तेंदुए में सीटबेल्ट सैंडबॉक्स प्रोफाइल का उपयोग करके प्रदान की गई अधिक दानेदार सुरक्षा प्रदान करने के लिए इस दृष्टिकोण का उपयोग करते हैं, जैसे कि आपके कोड के केवल विशिष्ट उपसंच को गंभीर या संवेदनशील कार्य करने की अनुमति है प्रदर्शन एक ट्रेडऑफ होगा, लेकिन आपका एकमात्र विकल्प हो सकता है

मैं अनुमान लगा रहा हूं कि लाइसेंसिंग फीस, नियम और समय-समय पर इनमें से किसी भी बिंदु पर तत्काल कार्रवाई हो सकती है। उम्मीद है कि आप जितनी जल्दी हो सके संघर्ष को सुलझाने में सक्षम होंगे। सौभाग्य!

यह सकल है, लेकिन आप वितरित ऑब्जेक्ट का उपयोग केवल एक अधीनस्थ प्रोग्राम पते और RPC में कक्षाओं में रखने के लिए कर सकते हैं। यदि आपको एक टन सामान आगे और पीछे हो रहा है तो यह गंदा हो जाएगा (और संभव नहीं हो सकता है कि यदि दोनों क्लास प्रत्यक्ष रूप से छेड़खानी कर रहे हैं, आदि)

अन्य संभावित समाधान हैं, लेकिन उनमें से बहुत सटीक स्थिति पर निर्भर हैं। विशेष रूप से, क्या आप आधुनिक या लीगेसी रनटायम्स का उपयोग कर रहे हैं, क्या आप वसा या एकल आर्किटेक्चर, 32 या 64 बिट हैं, ओएस विज्ञप्ति क्या आप लक्षित कर रहे हैं, क्या आप डायनामिक रूप से लिंक कर रहे हैं, स्थिर रूप से लिंक कर रहे हैं, या आपके पास कोई विकल्प है, और क्या यह संभवतः कुछ ऐसा करने के लिए ठीक है जिसके लिए नए सॉफ़्टवेयर अपडेट के रखरखाव की आवश्यकता हो सकती है

यदि आप वास्तव में बेताब हैं, तो आप क्या कर सकते हैं:

  1. किसी एक पुस्तकालय के सीधे लिंक के साथ नहीं
  2. ओजजेक रनटाइम रूटीन का एक वैकल्पिक संस्करण कार्यान्वित करें जो लोड टाइम पर नाम बदलता है ( objc4 प्रोजेक्ट चेकआउट करें, आपको क्या करने की ज़रूरत है I ऊपर दिए गए कुछ प्रश्नों पर निर्भर करता है, लेकिन इसका उत्तर कोई भी उत्तर नहीं होना चाहिए )।
  3. अपने नए कार्यान्वयन को इंजेक्ट करने के लिए mach_override की तरह कुछ का उपयोग करें
  4. सामान्य विधियों का उपयोग करते हुए नई लाइब्रेरी लोड करें, यह पैचबद्ध लिंकर रूटीन के माध्यम से जाकर उसका क्लासनाम बदल जाएगा

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

क्या आप एक गैर-टकराने वाले वर्ग में विरोधाभासी कक्षाओं को क्लोन करने के लिए रनटाइम फ़ंक्शंस (/usr/include/objc/runtime.h) का उपयोग करने पर विचार किया है, और फिर टकराने वाला वर्ग ढांचा लोड कर रहा है? (यह टकराने वाले चौखटे को काम करने के लिए अलग-अलग समय पर लोड किए जाने की आवश्यकता होगी।)

आप क्लास ईवार्स, विधियों (नाम और कार्यान्वयन पते) और नामों के साथ रनटाइम का निरीक्षण कर सकते हैं, और एक ही आइवर लेआउट, विधियों के नाम / कार्यान्वयन पतों के लिए गतिशील रूप से अपना स्वयं के निर्माण कर सकते हैं, और केवल नाम से भिन्न ( टक्कर)

निराशाजनक स्थितियां हताश उपायों के लिए बुलाती हैं क्या आपने एक लाइब्रेरीज़ के ऑब्जेक्ट कोड (या लाइब्रेरी फ़ाइल) को हैकिंग माना है, एक वैकल्पिक नाम के लिए टकरने का प्रतीक बदलकर – एक ही लंबाई की लेकिन एक अलग वर्तनी (लेकिन, सिफारिश, नाम की इसी लम्बाई)? स्वाभाविक रूप से बुरा

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

ऐसा लगता है कि मुद्दा यह है कि आप एक ही अनुवाद इकाई (स्रोत फ़ाइल) में दोनों सिस्टम से हेडर फ़ाइलों को संदर्भ नहीं दे सकते। यदि आप लाइब्रेरीज़ के चारों ओर उद्देश्य-सी रैपर बनाते हैं (प्रक्रिया में उन्हें और अधिक उपयोग करने योग्य बनाते हैं), और आवरण वर्गों के कार्यान्वयन में प्रत्येक पुस्तकालय के लिए केवल # हेडर शामिल करें, जो प्रभावी ढंग से अलग नाम collisions को अलग करेगा।

मेरे पास उद्देश्य-सी (बस शुरू हो रहा है) में पर्याप्त अनुभव नहीं है, लेकिन मुझे विश्वास है कि मैं सी में क्या करूँगा।

@compatibility_alias वर्ग नाम स्थान संघर्षों को हल करने में सक्षम हो, उदा

 @compatibility_alias NewAliasClass OriginalClass; 

हालांकि, यह किसी भी एनोम, टायफीफ्स, या प्रोटोकॉल नाम स्थान की टकरावों को हल नहीं करेगा । इसके अलावा, यह मूल वर्ग के @ वर्ग आगे की घोषणा के साथ अच्छी तरह से नहीं खेलता है चूंकि अधिकांश ढाँचा इन गैर-वर्ग की चीज़ों जैसे टाइप-फेफ्स के साथ आएंगे, इसलिए संभवतः आप नाम-स्थान की समस्या को सिर्फ संगतता_अलिअस के साथ ठीक नहीं कर पाएंगे।

मैंने तुम्हारी तरह एक ऐसी समस्या देखी , लेकिन मुझे स्रोत तक पहुंच थी और चौखटे का निर्माण कर रहा था। मैं इसके लिए सबसे अच्छा समाधान पाया @compatibility_alias सशर्त # enfines के साथ enums / typedefs / प्रोटोकॉल / आदि का समर्थन करने के लिए इस्तेमाल किया गया था। आप अन्य टकराने वाले ढांचे में सामग्री के विस्तार के जोखिम को कम करने के लिए प्रश्न में हेडर के लिए कम्पाइल यूनिट पर सशर्त रूप से ऐसा कर सकते हैं।

फाइलों को प्रीफ़िक्स करना मैं सबसे सरल समाधान है जिसके बारे में मुझे पता है। कोकोदेव के पास एक नेमस्पेस पृष्ठ है जो नामस्पेस टक्कर से बचने के लिए एक समुदाय का प्रयास है। इस सूची में स्वयं को जोड़ने के लिए बेझिझक, मेरा मानना ​​है कि यह वही है जो इसके लिए है।

http://www.cocoadev.com/index.pl?ChooseYourOwnPrefix

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

अधिक तकनीकी समाधान पर, यदि मैं आपकी स्थिति में था तो यह मेरी पसंद होगी

अगर टकराव केवल स्थिर लिंक स्तर पर है, तो आप चुन सकते हैं कि प्रतीकों को हल करने के लिए कौन सी पुस्तकालय का उपयोग किया जाता है:

 cc foo.o -ldog bar.o -lcat 

यदि foo.o और bar.o दोनों प्रतीक rat संदर्भ libdog तो libdog foo.o के rat और libcat को हल करेगा libcat को हल करेगा।

बस एक विचार .. परीक्षण या सिद्ध नहीं है और निशान का तरीका हो सकता है लेकिन क्या आपने कक्षा के लिए एक एडाप्टर लिखना माना है, जिसका उपयोग आप चौखटे के सरलतम या कम से कम उनके इंटरफेस से करते हैं?

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

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

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

फिर, किसी भी तरह से साबित नहीं हुआ लेकिन एक परिप्रेक्ष्य को जोड़ना पसंद आया। आशा करता हूँ की ये काम करेगा 🙂

यदि आपके पास दो फ़्रेमवर्क हैं जो समान फ़ंक्शन का नाम रखते हैं, तो आप फ्रेमवर्क को गतिशील रूप से लोड करने की कोशिश कर सकते हैं। यह असभ्य होगा, लेकिन संभव है यह उद्देश्य- C कक्षाओं के साथ कैसे करें, मुझे नहीं पता। मैं अनुमान लगा रहा हूं कि NSBundle कक्षा में ऐसे तरीकों होंगे जो एक विशिष्ट वर्ग को लोड करेंगे।