2010-04-11 7 views
21

मैंने अभी उद्देश्य सी सीखना शुरू कर दिया है और वास्तव में उलझन में हूं कि .h और .m फ़ाइलें एक दूसरे के साथ कैसे बातचीत करती हैं।कैसे .h और .m फाइलें उद्देश्य सी में इंटरैक्ट करने के बारे में संक्षिप्त विवरण?

Fraction.h

#import <Foundation/NSObject.h> 
    @interface Fraction : NSObject { 
     int numerator; 
int denominator; 
    } 
    - (void) print; 
    - (void) setNumerator: (int) n; 
    - (void) setDenominator: (int) d; 
    - (int) numerator; 
    - (int) denominator; 
    @end 

Fraction.m

#import "Fraction.h" 
    #import <stdio.h> 
    @implementation Fraction 
    -(void) print { printf("%i/%i", numerator, denominator); } 
    -(void) setNumerator: (int) n { numerator = n; } 
    -(void) setDenominator: (int) d { denominator = d; } 
    -(int) denominator { return denominator; } 
    -(int) numerator { return numerator; } 
    @end 

main.m

#import <stdio.h> 
    #import "Fraction.h" 
    int main(int argc, char *argv[]) { 
     Fraction *frac = [[Fraction alloc] init]; 
[frac setNumerator: 1]; 
[frac setDenominator: 3]; 
printf("The fraction is: "); 
[frac print]; 
printf("\n"); 
[frac release]; 
return 0; 
    } 
मैं क्या समझ से

, कार्यक्रम शुरू में शुरू होता है: इस साधारण प्रोग्राम 3 फ़ाइलें है main.m फ़ाइल चल रहा है। मैं बुनियादी सी अवधारणाओं को समझता हूं लेकिन यह पूरी "कक्षा" और "उदाहरण" सामान वास्तव में भ्रमित है। Fraction.h फ़ाइल में @interface संख्यात्मक और denominator को एक पूर्णांक के रूप में परिभाषित कर रहा है, लेकिन यह (शून्य) के साथ नीचे क्या कर रहा है? और नीचे फिर से परिभाषित करने का उद्देश्य क्या है? मैं भी इस बात के बारे में काफी उलझन में हूं कि Fraction.m के (शून्य) और (int) भागों के साथ क्या हो रहा है और यह सब मुख्य.एम फ़ाइल में कैसे लाया जाता है। मुझे लगता है कि मैं जो कहने की कोशिश कर रहा हूं वह यह है कि यह सीखने के लिए एक आसान आसान कार्यक्रम की तरह लगता है कि अलग-अलग हिस्सों एक-दूसरे के साथ कैसे काम करते हैं - क्या कोई गैर-तकनीकी शब्दकोष में समझा सकता है?

उत्तर

5

फाइलें बिल्कुल इंटरैक्ट नहीं करती हैं, उनका उपयोग केवल एक सम्मेलन है, आप main.m फ़ाइल में सबकुछ भी डाल सकते हैं।

उद्देश्य-सी सीखने के लिए एक अच्छा प्रारंभिक बिंदु introduction to the Objective-C language है।

10

आप Object Oriented Programming में देखने के लिए और शायद एक छोटे से अधिक ऑब्जेक्टिव-सी विकास में पढ़ OOP की अवधारणाओं पर अच्छी पकड़ प्राप्त करने की आवश्यकता आदि

आपके प्रश्न का उत्तर करने के लिए "ज के बीच अंतर क्या है और .m फाइलें ", .h फ़ाइलों में आपकी कक्षा के लिए घोषणा शामिल है, इसलिए मूल रूप से उन सभी विशेषताओं और विधियों का उपयोग किया जा सकता है जो इसका उपयोग कर सकते हैं। एमएम फाइल इन तरीकों का कार्यान्वयन है।

लेमन शब्दों में, हेडर फ़ाइल (.h) यह कहने का एक तरीका है "यह मैं कर सकता हूं" और .m "यह है कि मैं इसे कैसे करता हूं"। हालांकि यह थोड़ा और जटिल है।

0

संक्षेप में, एक उद्देश्य-सी कक्षा एक सी संरचना है। एक उदाहरण ऐसी संरचना का संदर्भ है जिसे स्मृति में आवंटित किया गया है। एक वर्ग का नाम होता है और एक उदाहरण में एक राज्य या मूल्य होता है।

वह चीज जो सी संरचना से अलग उद्देश्य-सी वर्ग सेट करती है वह नाम से विधि पते को देखने की क्षमता है। सरलीकृत शब्दों में, संरचना में नाम के आधार पर फ़ंक्शन पॉइंटर्स की हैश तालिका होती है।

उद्देश्य-सी ऑब्जेक्ट्स में कई अन्य नस्लों हैं, जैसे कि संदर्भ गिनती, लेकिन नाम से कॉलिंग विधियां इसका क्रूक्स है। एक एसईएल एक सी स्ट्रिंग है, लेकिन एक सी स्ट्रिंग एक एसईएल नहीं है।

जहां तक ​​हेडर और स्रोत फ़ाइलें, सम्मेलन द्वारा आप हेडर फ़ाइलों में एक वर्ग में इंटरफ़ेस घोषित करते हैं और स्रोत फ़ाइल में विधियों को परिभाषित करते हैं। चीजों को परिभाषित करना, प्रकार और स्थिरांक के अलावा, हेडर फ़ाइल में एक खराब अभ्यास है, जैसा कि स्रोत फ़ाइलों सहित है। आप स्रोत फ़ाइल में जो कुछ भी चाहते हैं उसे घोषित करने के लिए स्वतंत्र हैं, लेकिन यह स्रोत फ़ाइल के लिए अनिवार्य रूप से निजी है।

ए सी निष्पादन योग्य, और इस प्रकार एक उद्देश्य-सी निष्पादन योग्य, मुख्य समारोह में एक प्रविष्टि बिंदु है। सम्मेलन द्वारा मुख्य उद्देश्य उद्देश्य-सी परियोजनाओं में एक ही नाम वाली फ़ाइल में परिभाषित किया गया है।

58

जो लोग अन्य वातावरण से आते हैं वे हमेशा विश्वास करते हैं कि सी और ऑब्जेक्टिव-सी प्रोग्रामिंग में उपयोग की जाने वाली .c, .m, और .h फ़ाइलों के साथ कुछ जटिल हो रहा है।

वास्तव में, यह बहुत ही सरल है।

एक परियोजना को एकीकृत करने के उद्देश्य से एकीकृत विकास वातावरण - जैसे एक्सकोड - सभी .h फ़ाइलों को अनदेखा करें। वे क्या करते हैं प्रत्येक .c और .m फ़ाइल लेना और संकलित करना। यदि प्रोग्रामर (जो आपने) किसी भी # अंतर्निहित, या # आयात निर्देशों का उपयोग किया है, तो संकलक शामिल/आयातित .h फ़ाइल के पूरे पाठ को सम्मिलित करता है जहां निर्देश था।

तो, आप एक ज फ़ाइल था - insert.h - कि ने कहा:

in 

और एक ग फ़ाइल है कि ने कहा:

Alice 
#include "insert.h" 
Wonderland 

संकलक होगा, संसाधित करने के बाद # शामिल & #import निर्देशों, इस देखें:

Alice 
in 
Wonderland 

यह इस बहुत बहुत सरल विलय फ़ाइल है व्यवहार जो हम जटिल प्रोग्राम बनाने के लिए उपयोग करते हैं :)

। यह बहुत ही एक सम्मेलन है जिसके द्वारा प्रोग्रामर एक-दूसरे को बता सकते हैं कि फाइल को शामिल करने के लिए उपयुक्त है - संभावित रूप से कई बार - #include या #import का उपयोग करके।

.c और .m फ़ाइलों को इस तरह विलय नहीं किया गया है। प्रत्येक .c और .m फ़ाइल को अलग-अलग संकलित किया जाता है - .o फ़ाइलों का उत्पादन करने के लिए। प्रत्येक .o फ़ाइल संकलित कार्यों का संग्रह है। अंतिम प्रोग्राम का उत्पादन करने के लिए .o फ़ाइलों को फिर विलय कर दिया जाता है - या "लिंक" होता है। लिंकिंग चरण यह सुनिश्चित करता है कि प्रत्येक कार्य केवल एक बार मौजूद है, और यह कि सभी कार्यों को वास्तव में कहीं भी मौजूद किया जाता है।

सी & Objctive-C एक विशेष समारोह को परिभाषित करता है जो कहीं मौजूद होना चाहिए - main()। दोबारा, भाषा बहुत ही आराम से है - यह परवाह नहीं करता है कि .c या .m फ़ाइल main() फ़ंक्शन में है। केवल यह है कि यह कहीं किसी फ़ाइल में मौजूद है।

0

Fraction.h में कोड की नीचे दी गई रेखाएं गेटटर विधियों के अलावा कुछ भी नहीं हैं। वे उनके ऊपर घोषित दो int चर को फिर से परिभाषित नहीं कर रहे हैं।

- (int) numerator; 
- (int) denominator; 
संबंधित मुद्दे