2011-08-11 17 views
7

मुझे पता है कि प्रोग्रामर के रूप में श्रेणियों का उपयोग कैसे करें, लेकिन मुझे उत्सुकता है कि उन्हें कैसे कार्यान्वित किया जाता है। क्या संकलक उन्हें एक स्थिर प्रारंभकर्ता से class_replaceMethod पर कॉल में संकलित करता है? धन्यवाद।उद्देश्य सी में लागू श्रेणियां कैसे लागू की जाती हैं?

उत्तर

8

विषय पर नया उत्तर।

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

कक्षा में एक श्रेणी लोड करते समय श्रेणियों की विधि सूची मौजूदा सूची में तैयार की गई है, और कैश फ़्लश किए गए हैं। चूंकि सूची क्रमशः खोजी गई है इसका मतलब है कि श्रेणियों की विधि से पहले की खोज पर मूल विधि मिलेगी।

कक्षाओं का यह सेटअप आंशिक डेटा से, आंशिक डेटा से, आंशिक रूप से किया जाता है, जब कक्षा का पहली बार उपयोग किया जाता है। और निष्पादन योग्य कोड के साथ एक बंडल लोड करते समय फिर से किया जा सकता है।

संक्षेप में यह class_replaceMethod() से थोड़ा अधिक निम्न स्तर है।

+0

धन्यवाद, इसे मिला। –

+0

क्या पहली बार इस्तेमाल होने से पहले एक श्रेणी को "प्रारंभ करना" करने के लिए कोई अच्छी जगह है? मैंने 'प्रारंभिक' की कोशिश की लेकिन ऐसा लगता है कि जैसे ही श्रेणी वर्ग पहली बार बुलाया जाता है, इसलिए श्रेणी शुरू करना अनावश्यक हो सकता है, और अधिक महत्वपूर्ण, परिणामस्वरूप अनंत लूप हो सकते हैं। – Rivera

0

श्रेणियाँ किसी विशेष कार्यान्वयन की जरूरत नहीं है, वे कार्यान्वयन की प्रकृति शून्य से वास्तव में कर रहे हैं।

प्रोटोकॉल रन-टाइम पर कक्षाओं पर मार्कर के रूप में कार्य करता है। प्रोटोकॉल की सूची प्राप्त करने के लिए आप class_copyProtocolList() का उपयोग कर सकते हैं जो कक्षा रनटाइम से अनुरूप होती है। प्रोटोकॉल प्राप्त करने के लिए प्रोटोकॉल प्राप्त करने के लिए एक भाई protocol_copyProtocolList() फ़ंक्शन है।

ध्यान दें कि ये विधियां केवल इस विशेष कक्षा या प्रोटोकॉल के लिए प्रोटोकॉल की एक सूची लौटाती हैं। संदर्भ से सुपरक्लास, या अन्य प्रोटोकॉल से नहीं। इसका मतलब है कि रन-टाइम पर वास्तविक लुकअप महंगा होगा। इसके बजाय अनुरूपता के लिए पूछने के लिए class_conformsToProtocol()(या protocol_conformsToProtocol()) का उपयोग करें, ये विधियां परिणाम कैश कर सकती हैं।

अभ्यास में रन-टाइम पर अनुरूपता के लिए पूछताछ शायद ही कभी एक अच्छा विचार है। प्रोटोकॉल अनुरूपता संकलक द्वारा चेतावनियों के साथ मान्य है, अगर डेवलपर इन चेतावनियों को अनदेखा करना चुनता है, तो ... यह उनकी पसंद है।

+0

प्रोटोकॉल के बारे में आप क्यों बात कर रहे हैं? वे श्रेणियों से पूरी तरह से अलग संरचनाएं हैं? –

+0

@ जोशुआ वेनबर्ग - सच है, मैंने खुद का गधा बनाया है। मैं 100% यकीन था कि सवाल प्रोटोकॉल था। अरे, सही संदर्भ में मुझे अपना जवाब पसंद आया होगा। – PeyloW

3

आप जो कुछ भी जानना चाहते थे उसके बारे में आप यह जानना चाहते हैं कि वे यहां से कैसे काम करते हैं।

http://opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-runtime-new.mm

क्रम पूरी तरह से खुला स्रोत है।

+0

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

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