2013-07-16 8 views
14

का उपयोग करने के लिए मुझे लगता है कि मैं केवल UIKIT_EXTERN का उपयोग करूंगा यदि मेरे प्रोजेक्ट में C++ कोड का कोई मौका है जो चर का उपयोग कर सकता है।UIKIT_EXTERN बनाम केवल बाहरी

यदि ऐसा है तो क्या यह UIKIT_EXTERN के साथ आपके सभी बाहरी उपलब्ध स्थिरांक घोषित करने के लिए सुरक्षित नहीं होगा?

मैं इसे और कैसे नहीं देख सकता?

+0

एक और विकल्प 'FOUNDATION_EXPORT' प्रति http://stackoverflow.com/questions/10953221/foundation-export-vs- वैकल्पिक –

उत्तर

22

मुझे अनुमान है कि मैं केवल UIKIT_EXTERN का उपयोग करूंगा यदि मेरे प्रोजेक्ट में सी ++ कोड का मौका है जो चर का उपयोग कर सकता है।

दाएं। यह प्राथमिक कारण है। ऐसा इसलिए होता है क्योंकि सी और सी ++ प्रतीक विभिन्न नामकरण सम्मेलनों का उपयोग करते हैं।

कम आम कारण है: UIKIT_EXTERN डिफ़ॉल्ट दृश्यता भी निर्दिष्ट करता है।

नोट: extern के बाद से "प्रतीक" - "चर" नहीं है क्योंकि स्थिरांक, कार्य, और cetera पर भी लागू किया जा सकता है।

यदि ऐसा है तो क्या यह UIKIT_EXTERN के साथ आपके सभी मौजूदा उपलब्ध स्थिरांक घोषित करने के लिए सुरक्षित नहीं होगा?

लघु उत्तर: यह अच्छा अभ्यास हो जाएगा (पढ़ें: 'सुरक्षित') इस फार्म का उपयोग करने के लिए है, लेकिन यह आम तौर पर अपने पुस्तकालय के लिए सबसे अच्छा UIKIT_EXTERN के अपने स्वयं के बराबर घोषित करने के लिए है।


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

इसके अलावा, UIKit उन सभी प्लेटफॉर्म पर उपलब्ध नहीं है जहां आईओएस प्रोग्राम चलाए जा सकते हैं (यानी यह सी, सी ++ हो सकता है, या फाउंडेशन पर निर्भर करता है और ओएस एक्स को पोर्टेबल)। तो अगर किसी ने (उत्सुकता से) अपने आप को घोषित करने का आग्रह किया तो एक बुरा विचार था, CF_EXPORT (कोरफाउंडेशन के समकक्ष) का चयन करना एक और पोर्टेबल विकल्प होगा क्योंकि इसका उपयोग सी, सी ++ और ओएस एक्स पर भी किया जा सकता है। इसके अलावा, आपकी लाइब्रेरी केवल CoreFoundation (न्यूनतम पर) शामिल करने की आवश्यकता है।

यदि आपकी लाइब्रेरी UIKit पर निर्भर करती है और ढांचे को आपकी लाइब्रेरी द्वारा आयात किया जाना चाहिए, तो यह बेहद असंभव है कि उनके समानार्थी शब्द का उपयोग करने से आपकी लाइब्रेरी में समस्या हो सकती है।

लेकिन यह स्थितियों का एक बहुत बड़ा सेट है - आपकी लाइब्रेरी के लिए यह केवल घोषित करना बहुत आसान है। संक्षेप में, एक अच्छी तरह लिखित और पोर्टेबल पुस्तकालय (लगभग) कभी भी 'कच्चे' extern का उपयोग नहीं करना चाहिए, न ही अनावश्यक लाइब्रेरी निर्भरता एक अच्छी बात होनी चाहिए (इस मामले में UIKit)। इस तरह के UIView उपवर्गों का एक संग्रह के रूप में -

यह एक बुरा डिजाइन पसंद UIKIT_EXTERNजब तक अपने पुस्तकालय UIKit से अविभाज्य थे उपयोग करने के लिए किया जाएगा।

यदि आपकी लाइब्रेरी सिर्फ फाउंडेशन प्रकारों से संबंधित है, तो UIKit आयात करने का अर्थ है कि आपकी लाइब्रेरी ओएस एक्स पर अनुपयोगी होगी (जब तक कि UIKit आयात हटाया नहीं जाता है)।

जिन लोगों को सी ++ का उपयोग सी (+ सुपरसेट्स समेत) का अधिक अनुभव नहीं है, वे नहीं जानते कि प्रतीक नाम अलग हैं, इसलिए वे सीधे extern का उपयोग कर सकते हैं। अंत में, कुछ कार्यक्रमों को प्रारंभ में सी और/या उद्देश्य-सी अनुवादों के बाहर उपयोग करने के लिए डिज़ाइन नहीं किया गया था, इसलिए उन्होंने अनुवाद के लिए सशर्त सजावट के बिना extern का उपयोग किया होगा।

अंत में, UIKIT_EXTERN वास्तव में ऐसा नहीं कर सकते कि आप क्या उम्मीद/चाहते हैं, क्योंकि यह निर्दिष्ट करता है:

  • एक extern सी प्रतीक
  • जो डिफ़ॉल्ट दृश्यता

है ObjC अनुवाद के लिए दिखाई दे पुस्तकालय प्रतीकों के लिए , यह पूर्ण है।

+2

वाह, महान उत्तर है। धन्यवाद। –

+0

@ बेनकॉफ़मैन आपका स्वागत है + धन्यवाद – justin

1

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

जैसा कि आप इंगित करते हैं, मैक्रो का उपयोग करने का मुख्य लाभ यह है कि यह अतिरिक्त सी ++ extern सुरक्षा में बनाता है, इसलिए यदि आप वास्तव में पुस्तकालय विकसित कर रहे हैं, तो यह निश्चित रूप से एक अच्छा विचार है (अन्यथा कॉलर को अवगत होना चाहिए और extern C घोषणा जोड़ें)।

यह एडीसी प्रलेखन यहाँ में शामिल है:

और काफी अच्छी तरह से जवाब यहां है:

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