2011-06-14 12 views
5

मेरे एप्लिकेशन में एक प्लगइन सिस्टम है जो मेरे उपयोगकर्ताओं को अपने स्वयं के प्लगइन लिखने की अनुमति देता है जो रनटाइम पर लोड हो जाते हैं। आम तौर पर यह ठीक है लेकिन कुछ मामलों में दो प्लगइन्स एक ही पुस्तकालयों का उपयोग करते हैं जो उन दोनों के बीच टकराव का कारण बनेंगे।कोको/उद्देश्य-सी प्लगइन्स टकराव

उदाहरण:

प्लग एक JSON के साथ काम करने के लिए TouchJSON का उपयोग करना चाहता है और इस तरह निर्माता प्लगइन स्रोत के लिए TouchJSON कोड कहते हैं और यह संकलित और प्लगइन बाइनरी में जुड़ा हुआ हो जाता है। बाद में प्लगइन बी भी उसी लाइब्रेरी का उपयोग करना चाहता है और वही करता है। अब जब मेरे ऐप इन दो विभिन्न प्लग इन यह इस का पता लगाता है लोड करता है और इस तरह एक चेतावनी बाहर थूक:

कक्षा CJSONScanner दोनों [path_to_plugin_a] और [path_to_plugin_b] में किया जाता है। दो में से एक का उपयोग किया जाएगा। कौन सा अपरिभाषित है।

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

जब तक दोनों प्लगइन्स पुस्तकालय की ठीक उसी संस्करण का उपयोग के रूप में यह शायद काम करेंगे लेकिन जैसे ही एक में एपीआई परिवर्तन में समस्या आने पर होगा का एक समूह के रूप में प्लगइन।

क्या मैं इसके बारे में कुछ भी कर सकता हूं?

उत्तर

4

बंडल लोडिंग सिस्टम नाम विवादों को शांत रूप से हल करने का कोई मतलब नहीं प्रदान करता है। वास्तव में, अगर ऐसा होता है तो हमें क्या करना है इसके बजाय हमें ensure ourselves that the problem doesn't happen बताया जाता है। (जाहिर है, आपके मामले में, यह संभव नहीं है)।

आप इस समस्या के साथ file a bug report कर सकते हैं।

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

+0

जैसा मैंने सोचा था। मैं बस सोच रहा हूं कि कोई भी इस समस्या में नहीं चल रहा है जब बहुत सारे मैक ऐप्स हैं जो प्लगइन्स (कोडा, टेक्स्टमैट, एक्सकोड इत्यादि) – hjaltij

+0

@zneak को अनुमति देते हैं, तो क्या आपको फ्रेमवर्क प्रदान न करने के लिए टचजेसन के साथ एक बग रिपोर्ट दर्ज करना है? – hooleyhoop

2

एक एकल प्रक्रिया मॉडल में, इस से निपटने के लिए एक ही रास्ता यह सुनिश्चित करें कि साझा कोड (अधिक सटीक, साझा ऑब्जेक्टिव-सी वर्ग) एक बार भरी हुई है है।

  • एक ढांचे में साझा कोड डालें: ऐसा करने के दो तरीके हैं।
  • किसी लोड करने योग्य बंडल में साझा कोड रखो, और बंडल लोड करता है, तो प्रासंगिक वर्गों पहले से ही उपलब्ध नहीं हैं (NSClassFromString() का उपयोग कर जांच) जब प्लग में भरी हुई है। क्लाइंट कोड को सीधे कक्षाओं का जिक्र करने के बजाए NSClassFromString() का उपयोग करना होगा।

बेशक, यदि आप प्लग-इन के नियंत्रण में नहीं हैं तो आप इनमें से किसी भी योजना को लागू नहीं कर सकते हैं। सबसे अच्छा आप कर सकते हैं उचित दिशानिर्देश और संभवतः आधारभूत संरचना प्रदान करते हैं; उदाहरण के लिए, दूसरे मामले में लोड हो रहा है, आवेदन के द्वारा नियंत्रित किया जा सकता है शायद एक एम्बेडेड बंडल के लिए जाँच करें और नाम लोड करने के लिए अगर यह उपलब्ध नहीं है करने के लिए एक वर्ग को निर्दिष्ट करके प्लग-इन के Info.plist

+0

अच्छा जवाब भी, धन्यवाद! – hjaltij

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