2012-08-07 16 views
6

द्वारा परिवर्तित किया गया है क्योंकि उद्देश्य-सी एक सी सुपरसेट है, सभी उद्देश्य-सी विशिष्ट विवरणों को एक .m फ़ाइल के संकलन के दौरान सी कथन में परिवर्तित किया जाता है (द्वारा प्रीप्रोसेसर, मुझे लगता है)। इसलिए, उदाहरण के लिए, [receiver method] जैसे संदेश अभिव्यक्ति को संदेश फ़ंक्शन objc_msgSend(receiver, selector) पर कॉल में परिवर्तित कर दिया गया है।उद्देश्य-सी 2.0 वर्ग इंटरफ़ेस और कार्यान्वयन जीसीसी या क्लैंग

मेरा प्रश्न है:

@interface ClassA { 
    int var1; 
    float var2; 
    id var3; 
} 

-(void) method1; 
-(int) method2: (int) num1; 
@end 

@implementation ClassA 
-(void) method1 { 
    // Implementation of the method 
} 

-(int) method2: (int) num1 { 
    // Implementation of the method 
} 

@end 

क्या यह संकलक द्वारा में बदल (ऑब्जेक्टिव-सी के 2.0 संस्करण में) है: अगर मैं इस तरह एक वर्ग परिभाषा है? क्या यह कक्षा बनाने के लिए objc_allocateClassPair(), class_addIvar(), class_addMethod() और objc_registerClassPair() जैसे कार्यों पर कॉल में परिवर्तित हो गया है, इसके इंस्टेंस वेरिएबल जोड़ें, इसके तरीके जोड़ें और क्रमशः कक्षा पंजीकृत करें (ताकि क्लास स्ट्रक्चर को वास्तव में रनटाइम में परिभाषित किया जा सके निष्पादन योग्य फ़ाइल से एक संरचना के रूप में लोड किया जा रहा है)?

उत्तर

14

ऑब्जेक्टिव-सी के बाद से एक सी सुपरसेट है, सभी ऑब्जेक्टिव-सी निर्दिष्ट कथन एक मीटर फ़ाइल के संकलन ( द्वारा पूर्वप्रक्रमक, मुझे लगता है) के दौरान सी बयान में बदला जाता है।

1988. में सच था कि ऑब्जेक्टिव-सी अभी भी उस फैशन में संकलित किया जा सकता है, यह एक लंबे समय में नहीं किया गया है।

कंपाइलर सी और-- कभी-कभी सी ++ के साथ उद्देश्य-सी का विश्लेषण करता है, और एक सार वाक्यविन्यास पेड़ [एएसटी] उत्सर्जित करता है जो पोस्ट प्रीप्रोसेस्ड आउटपुट का प्रतिनिधित्व करता है। उस एएसटी में विभिन्न उद्देश्यों-सी परिभाषाओं को काफी सीधे शामिल किया गया है।

ध्यान दें कि जीसीसी के संकलन और एलएलवीएम के संकलन का विवरण अलग हो रहा है।

यदि आप संकलित आउटपुट को देखते हैं, तो आप देखेंगे कि mach-o फ़ाइल - निष्पादन योग्य उत्पाद - फ़ाइल में विभिन्न अनुभाग हैं जिनमें क्लास परिभाषाओं, चयनकर्ता तालिकाओं, ivar सहित उद्देश्य-सी मेटाडेटा शामिल है लेआउट, आदि ... संकलक इस मेटाडेटा को .o फ़ाइल में उत्पन्न करता है और फिर लिंकर इसे सभी को एक साथ जोड़ता है, डुप्लिकेट जानकारी को हटा देता है (जो डुप्लिकेट प्रतीक नहीं है), और mach-o लिखता है।

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

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