2012-02-19 6 views
41

मैं समझने की कोशिश कर रहा हूं कि सीएफ और एनएस ऑब्जेक्ट्स दोनों मौजूद क्यों हैं, जो एक ही काम करने लगते हैं और टोल-फ्री ब्रिजिंग के माध्यम से अदला-बदले होते हैं। यदि, कहते हैं, CFArray और NSArray एक ही काम करते हैं, और मैं उनके बीच स्वतंत्र रूप से डाला जा सकता हूं, तो दोनों में क्या बिंदु मौजूद है? क्या अंगूठे के नियम दूसरे के ऊपर उपयोग करने के बारे में हैं? क्या सीएफ ऑब्जेक्ट्स केवल पुराने ढांचे से विरासत वस्तुएं हैं? इसमें कोई अंतर्दृष्टि की सराहना की जाएगी।सीएफ़ ऑब्जेक्ट बनाम एनएस ऑब्जेक्ट्स

+3

यह ध्यान दिया जाना चाहिए कि ए) सभी सीएफ प्रकारों में एनएस समकक्ष और इसके विपरीत नहीं है, और बी) सब कुछ नहीं जिनके नाम उपसर्ग से अलग हैं, वास्तव में "टोल-फ्री ब्रिज" हैं; उदाहरण के लिए, 'सीएफबंडल' और' एनएसबंडल 'नहीं हैं।अधिक [दस्तावेज़ों में] (https://developer.apple.com/library/mac/documentation/General/Conceptual/CocoaEncyclopedia/Toll-FreeBridgin/Toll-FreeBridgin.html) हमेशा की तरह। –

उत्तर

58

क्रम में आपके सवालों के जवाब के लिए:

  1. क्या उनमें से बिंदु दोनों मौजूदा रहा है? कुछ कारण हैं।

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

    यदि आप विंडोज़ (उदाहरण के लिए) पर उपयोग करने के लिए तीसरे पक्ष के लिए पुस्तकालय लिखना चाहते हैं, तो आपको सी एपीआई प्रदान करने की आवश्यकता है।

    यदि आप निम्न स्तर की लाइब्रेरी लिखना चाहते हैं, तो अपने ऑपरेटिंग सिस्टम के कर्नेल के साथ इंटरफेसिंग के लिए कहें, और आप ऑब्जेक्टिव-सी मैसेजिंग के ओवरहेड नहीं चाहते हैं, तो आपको सी एपीआई चाहिए।

    तो कोर फाउंडेशन, एक शुद्ध सी लाइब्रेरी रखने के लिए ये अच्छे कारण हैं।

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

  2. आपको एक या दूसरे का उपयोग कब करना चाहिए? आम तौर पर, आपको ऑब्जेक्टिव-सी कक्षाओं (उदा। NSArray) का उपयोग करना चाहिए, जब भी आप कर सकते हैं, क्योंकि उद्देश्य-सी इंटरफ़ेस का उपयोग करना अधिक सुखद है: myArray.count (या [myArray count]) CFArrayGetCount(myArray) से पढ़ने और लिखना आसान है। आपको कोर फाउंडेशन एपीआई का केवल तभी उपयोग करना चाहिए जब आपको वास्तव में आवश्यकता हो: जब आप उस प्लेटफ़ॉर्म पर हों जिसमें ऑब्जेक्टिव-सी नहीं है, या जब आपको कोर फाउंडेशन एपीआई प्रदान करने वाली सुविधाओं की आवश्यकता होती है लेकिन उद्देश्य-सी ऑब्जेक्ट्स की कमी होती है। उदाहरण के लिए, आप CFArray या CFDictionary बनाते समय कॉलबैक निर्दिष्ट कर सकते हैं जो आपको गैर-संदर्भ-गिनती ऑब्जेक्ट्स स्टोर करने देते हैं। NSArray और NSDictionary कक्षाएं आपको ऐसा करने नहीं देती हैं - वे हमेशा मानते हैं कि आप संदर्भ-गणना वाली वस्तुओं को संग्रहीत कर रहे हैं।

  3. क्या सीएफ़ वस्तुओं केवल विरासत वस्तुओं हैं? हर्गिज नहीं। वास्तव में, नेक्स्टस्टेप केवल उद्देश्य-सी फाउंडेशन लाइब्रेरी और नो (पब्लिक) कोर फाउंडेशन लाइब्रेरी के साथ वर्षों तक अस्तित्व में था। जब ऐप्पल को उसी निम्न-स्तरीय ऑपरेटिंग सिस्टम सुविधाओं के शीर्ष पर कार्बन एपीआई और कोको एपीआई दोनों का समर्थन करने की आवश्यकता होती है, तो उन्होंने दोनों को समर्थन देने के लिए कोर फाउंडेशन (या सार्वजनिक) बनाया।

संयोग से, कोर फाउंडेशन में से कुछ खुला स्रोत है। आप यहां मैक ओएस एक्स 10.10.5 के लिए ओपन सोर्स हिस्सा पा सकते हैं: https://opensource.apple.com/source/CF/CF-1153.18/। मुझे बहुत जानकारीपूर्ण होने के लिए CFRunLoop और CFStream का स्रोत कोड मिला है।

+0

बहुत बढ़िया सारांश, रोब। धन्यवाद! – Eric

1

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

एनएस नेक्स्टस्टेप के लिए खड़ा है, जो पुराना ओएस था जिसे मैक ओएस एक्स बनाया गया था। एनएस-प्रीफिक्स्ड ऑब्जेक्ट्स आमतौर पर ऑब्जेक्टिव-सी या सी या यहां तक ​​कि कुछ सी ++ में लिखे जाते हैं।

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

(CoreGraphics के लिए तटरक्षक, UIKit के लिए यूआई, quicklook के लिए QL, AVFoundation के लिए ए वी, MediaPlayer के लिए सांसद, MessageFoundation के लिए म्यूचुअल फंड, GLKit के लिए जीएल, और एम के MapKit के लिए भविष्य में संदर्भ के लिए, वहाँ कुछ और उपसर्गों मौजूद हैं) अगर मैंने किसी को याद किया है, तो मैं खुशी से संपादित करूंगा)।

+2

यह उत्तर मूल रूप से सही है, लेकिन कुछ भ्रम पैदा कर सकता है। कोर फाउंडेशन "उद्देश्य सी आधारित वस्तुओं का उपयोग नहीं करता है।" कुछ मामलों में कोको वस्तुओं को कोर फाउंडेशन ऑब्जेक्ट्स का उपयोग करके कार्यान्वित किया जाता है, लेकिन कभी भी दूसरी तरफ नहीं। कोको ऐप्स को CoreFoundation.framework को लिंक करना होगा। कोर फाउंडेशन ऐप्स को फाउंडेशन.फ्रेमवर्क को लिंक करने की ज़रूरत नहीं है (जो एनएसएसटींग और इसके ओबीजेसी दोस्तों को प्रदान करता है)। मैं सीएफ को "ऐप्पल की आंतरिक वस्तुओं" के रूप में भी नहीं देखूंगा। वे एक पूर्ण सार्वजनिक एपीआई हैं और आमतौर पर कोर टेक्स्ट जैसे अन्य कोर फ्रेमवर्क के साथ उपयोग किए जाते हैं। जैसा कि आप कहते हैं, आम तौर पर आपको एनएस का उपयोग करना चाहिए जबतक आपको सीएफ की आवश्यकता न हो। –

+0

अब इसे संपादित करना। थैंक्स – CodaFi

+0

जब आप कहते हैं कि सीएफ ऑब्जेक्ट्स आवंटित रूप से आवंटित हैं तो आपका क्या मतलब है? –

3

इस प्रश्न का कुछ इतिहास है। कोर फाउंडेशन ऑपरेशन के दिमाग है। यह ज्यादातर सी में लिखा गया है। यह एप्पल के नेक्सट और उनके एपीआई के अधिग्रहण के साथ बनाया गया था और उनके लिए बहुत कुछ है। एनएस * कक्षा अक्सर सीएफ * प्रकार के शीर्ष पर बनाए गए उद्देश्य सी सार इंटरफेस होते हैं। इसलिए, जब आप पूछते हैं कि क्यों CFArray और NSArray दोनों मौजूद हैं, तो जवाब यह है कि वे वास्तव में नहीं करते हैं। NSArrays CFArrays हैं, NSStrings CFStrings आदि हैं। यही कारण है कि टोल फ्री-ब्रिजिंग संभव है।

अधिक रोचक और विस्तृत पढ़ने के लिए, मैं आपको this blog post पर संदर्भित करता हूं।

11

कोर फाउंडेशन विभिन्न प्रकार के सामान्य डेटा संरचनाओं के लिए एक सी एपीआई है। इनमें से अधिकतर डेटा संरचनाओं में कोको में समकक्ष हैं, लेकिन उनमें से सभी नहीं। समकक्षों में से अधिकांश टोल फ्री ब्रिज हैं, जिससे उन्हें एक दूसरे के लिए इस्तेमाल किया जा सकता है, लेकिन उनमें से सभी भी नहीं।

टोल फ्री ब्रिजिंग एक बहुत चालाक कार्यान्वयन चाल है। यदि आप अंतर्निहित विवरण चाहते हैं, तो ridiculous_fish post देखें कि @ मैट वाइल्डिंग बताते हैं। यह विषय पर सबसे अधिक आधिकारिक है (और iOS:PTL अध्याय 1 9 पर एक बड़ा प्रभाव जो यह भी बताता है कि यह सब कैसे काम करता है)। लेकिन यह ज्यादातर उद्देश्यों के लिए वास्तव में कोई फर्क नहीं पड़ता। मैट नोट्स के रूप में, आप आम तौर पर दिखा सकते हैं कि NSArrayCFArrayRef जैसा ही है। यह कई मामलों में वास्तव में सच नहीं है, लेकिन यह कभी-कभी सत्य होता है, और अधिकांश समय के करीब पर्याप्त होता है। यह कहने जैसा ही है कि @"stuff"NSString जैसा stuff है। यह ज्यादातर सच है, लेकिन बिल्कुल नहीं।

जब ओएस 9 ओएस एक्स में स्थानांतरित हो गया, तो उद्देश्य-सी-जैसे डेटा संरचनाओं तक सी पहुंच प्रदान करना बहुत सुविधाजनक था। कई निम्न स्तरीय ढांचे आज प्रदर्शन कारणों से सी एपीआई का पर्दाफाश करते हैं। आपको सीएफ के बारे में "विरासत" या "आंतरिक" के रूप में नहीं सोचना चाहिए। आपको इसे निम्न स्तर के रूप में सोचना चाहिए और आपको केवल उस शक्ति का उपयोग करना चाहिए जब आपको इसकी शक्ति की आवश्यकता होती है, या निम्न स्तर के ढांचे के साथ काम कर रहे हैं जिसके लिए इसकी आवश्यकता होती है।

सीएफ ऑब्जेक्ट्स अक्सर अपने एनएस समकक्षों की तुलना में अधिक लचीला होते हैं। उदाहरण के लिए, CFDictionaryRef में गैर-ऑब्जेक्ट कुंजी और मान हो सकते हैं, जबकि NSDictionary नहीं हो सकता है। (बेशक वे टोल-फ्री ब्रिज हैं, इसलिए आप एक गैर-बनाए रखने वाले CFDictionaryRef बना सकते हैं और फिर इसे NSDictionary के रूप में देख सकते हैं। ट्रिकी कि ....)

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

+0

रोब, महान स्पष्टीकरण। आपने एक मुद्दा उठाया जो मैंने सोचा था कि दिलचस्प था। @ "स्ट्रिंग" और एनएसएसटींग के बीच "स्ट्रिंग" युक्त क्या अंतर है? मैंने सोचा कि @ "स्ट्रिंग" निहित एनएसएसटींग में था ... – Eric

+5

@ "स्ट्रिंग" वास्तव में एक '__NSCFConstantString' है, जो 'NSString' का एक (क्रमबद्ध) उप-वर्ग है। ("सॉर्ट-ऑफ" क्योंकि यह एक टोल-फ्री ब्रिज क्लास है, जो सबक्लास के समान नहीं है।) लगातार स्ट्रिंग __TEXT सेगमेंट में हैं, ढेर नहीं (उनके अंतर्निहित सीस्ट्रिंग के साथ, जो अलग से संग्रहीत है) , और वे 'बनाए रखने' और 'रिलीज' कॉलों को अनदेखा करते हैं। –

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