मैक ओएस एक्स के लिए कार्यक्रम बनाना। भाग 1: परिचय और उद्देश्य-सी

प्रविष्टि


मुझे लगता है कि सभी ने मैक ओएस एक्स के बारे में डिजाइनरों और गृहिणियों के लिए एक ऑपरेटिंग सिस्टम के रूप में सुना है। लेकिन मैं ओएस एक्स के लिए विकास के साधनों के बारे में बात करना चाहता हूं, अन्यथा अच्छे कार्यक्रम लिखे जाते हैं, और कोई नहीं जानता कि वे क्या करते हैं।

मुझे तुरंत कहना होगा कि मैं क्रॉस-प्लेटफ़ॉर्म फ्रेमवर्क और टूलकिट (जैसे क्यूटी) के बारे में या कंसोल एप्लिकेशन बनाने के बारे में बात नहीं करूंगा, मैं बात करूंगा कि मैक ओएस एक्स को अन्य ऑपरेटिंग सिस्टम से अलग बनाता है, जैसे कि कोको फ्रेमवर्क। मैं तुरंत एक आरक्षण करूंगा कि मैं अन्य रूपरेखाओं के साथ तुलना से बचने की कोशिश करूंगा, मैं सिर्फ कोको के बारे में बात करना चाहता हूं।

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

लेकिन नए ओएस में लगभग अपरिचित एपीआई को शामिल करना एक बहुत बुरा निर्णय होगा, इसलिए 2 और जोड़े गए: क्लासिक और कार्बन।

क्लासिक को मैक ओएस 9 अनुप्रयोगों को चलाने के लिए डिज़ाइन किया गया है, फिलहाल यह विचार करने के लिए व्यर्थ है, क्योंकि इंटेल प्रोसेसर पर जाने के बाद, स्पष्ट कारणों के लिए, क्लासिक को सिस्टम से बाहर कर दिया गया था।

कार्बन मैक ओएस 9 से ओएस एक्स में आसानी से अनुप्रयोगों को स्थानांतरित करने के लिए बनाया गया था, जो केवल एक दर्जन में उपलब्ध प्रोग्राम कोड नई कार्यक्षमता को जोड़ने की क्षमता के साथ है। अजीब तरह से पर्याप्त है, लेकिन कई एप्लिकेशन अभी भी कार्बन में लिखे गए हैं (उदाहरण के लिए, मैक के लिए एमएस ऑफिस और कुछ एडोब उत्पाद)।

फिलहाल, कार्बन और कोको फ्रेमवर्क समानांतर में विकसित हो रहे हैं, लेकिन मैक ओएस एक्स की अगली रिलीज से केवल कोको विकसित किया जाएगा।

कोको के लिए मुख्य विकास भाषा उद्देश्य-सी है, और भविष्य में चूंकि सभी उदाहरण इस भाषा में जाएंगे, इसके पहले भाग के लिए मैं आपको इसके बारे में बताऊंगा। लेकिन अगर आप पहले से ही पायथन या रूबी के मालिक हैं, तो आपको XCode 3.0 (विकास संकेत, इसके बारे में अगले भाग में) में उद्देश्य-सी सीखने की जरूरत नहीं है, इन भाषाओं के लिए बाइंडिंग "स्पार्कलिंग" है।

ऑब्जेक्टिव-सी प्रोग्रामिंग लैंग्वेज


सी भाषा के व्यापक रूप से ज्ञात और व्यापक वस्तु विस्तार के अलावा - सी ++ भाषा - इसका एक और विस्तार है- ऑब्जेक्टिव-सी भाषा, जो कि सी भाषा के साथ बेहद सरल, पूरी तरह से संगत है और स्मालटाक भाषा से निर्मित एक बहुत शक्तिशाली और अभिव्यंजक वस्तु मॉडल है।

पिछली सदी के 80 के दशक की शुरुआत में ब्रैड कॉक्स द्वारा इस भाषा को गढ़ा गया था। कॉक्स का लक्ष्य एक ऐसी भाषा बनाना था जो सॉफ्टवेयर आईसी की अवधारणा का समर्थन करता है। यह अवधारणा ऑफ-द-शेल्फ घटकों (ऑब्जेक्ट्स) से कार्यक्रमों को इकट्ठा करने की क्षमता को संदर्भित करती है, जिस तरह जटिल इलेक्ट्रॉनिक उपकरणों को आसानी से ऑफ-द-शेल्फ एकीकृत सर्किट (आईसी, एकीकृत करकुट्स) के एक सेट से इकट्ठा किया जा सकता है। इसके अलावा, इस तरह की भाषा काफी सरल होनी चाहिए और सी भाषा पर आधारित होने के कारण डेवलपर्स के संक्रमण को सुविधाजनक बनाने के लिए।

एक लक्ष्य यह भी था कि एक ऐसा मॉडल तैयार किया जाए जिसमें कक्षाएं खुद भी पूरी तरह से भरी हुई हों और आत्मनिरीक्षण और गतिशील संदेश प्रसंस्करण का समर्थन किया जा सके।

परिणामी ऑब्जेक्टिव-सी भाषा बेहद सरल निकली - सी प्रोग्रामर को इसमें महारत हासिल करने में कुछ ही दिन लगेंगे। यह वास्तव में सी भाषा का एक विस्तार है - सी भाषा ने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए बस नई सुविधाएँ जोड़ी हैं। इसके अलावा, कोई भी सी प्रोग्राम ऑब्जेक्टिव-सी (सी ++ के लिए, यह सच नहीं है) पर भी एक प्रोग्राम है।

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

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

भाषा में सामान्य प्रोटोकॉल समर्थन होता है (यानी, ऑब्जेक्ट इंटरफ़ेस की अवधारणा और प्रोटोकॉल स्पष्ट रूप से अलग हो जाते हैं)। ऑब्जेक्ट के लिए, वंशानुक्रम समर्थित है (एकाधिक नहीं), प्रोटोकॉल के लिए, एकाधिक वंशानुक्रम समर्थित है। एक ऑब्जेक्ट को एक बार में किसी अन्य ऑब्जेक्ट और कई प्रोटोकॉल से विरासत में लिया जा सकता है (हालांकि यह अधिक संभावना है कि प्रोटोकॉल विरासत नहीं है, लेकिन इसका समर्थन है)।

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

भाषा वाक्य रचना


ऑब्जेक्टिव-सी वस्तुओं को नामित करने के लिए एक विशेष आईडी प्रकार का उपयोग करता है। प्रकार आईडी का एक चर वास्तव में एक मनमाना वस्तु के लिए एक संकेतक है। शून्य स्थिरांक का उपयोग किसी वस्तु को अशक्त सूचक इंगित करने के लिए किया जाता है। आईडी की बात: डूम गेम का इंजन नेक्स्ट वर्कस्टेशंस पर विकसित किया गया था, इसलिए आईडी टाइप और आईडीसॉपर नाम के बीच संबंध हो सकता है।

इसके अलावा, आईडी के बजाय , आप एक स्पष्ट वर्ग संकेत के साथ अधिक परिचित संकेतन का उपयोग कर सकते हैं। विशेष रूप से, उत्तरार्द्ध संकलक को वस्तुओं द्वारा संदेश समर्थन की कुछ जांच करने की अनुमति देता है - यदि चर प्रकार से संकलक यह निष्कर्ष नहीं निकाल सकता है कि संदेश संदेश का समर्थन करता है, तो यह चेतावनी देगा (त्रुटि नहीं!)। इस प्रकार, भाषा प्रकार की जाँच का समर्थन करती है, लेकिन एक गैर-सख्त रूप में (यानी, पाया गया विसंगतियों को चेतावनी के रूप में लौटाया जाता है, त्रुटियों के रूप में नहीं)।

संदेश भेजने के लिए निम्नलिखित सिंटैक्स का उपयोग किया जाता है:
[रिसीवर संदेश];

संदेश में पैरामीटर भी हो सकते हैं:
[myRect setOrigin: 30.0: 50.0];
इस उदाहरण में, विधि (संदेश) का नाम setOrigin :: है। ध्यान दें कि वास्तव में एक तर्क पारित प्रत्येक तर्क से मेल खाता है। इस उदाहरण में, पहले तर्क में एक लेबल (बृहदान्त्र से पहले पाठ) है, और दूसरा नहीं है।

ऑब्जेक्टिव-सी भाषा आपको प्रत्येक तर्क को लेबल करने की अनुमति देती है, जो कोड की पठनीयता को बढ़ाती है और एक गलत पैरामीटर को पारित करने की संभावना को कम करती है।
[myRect setWidth: 10.0 ऊँचाई: 20.0];
इस उदाहरण में, setWidth: height: संदेश नाम है।

यह एक संदेश में मनमानी संख्या को पारित करने की क्षमता का भी समर्थन करता है:
[myObject MakeGroup: obj1, obj2, obj3, obj4, nil];

फ़ंक्शंस की तरह, संदेश मूल्यों को वापस कर सकते हैं, और, सी के विपरीत, डिफ़ॉल्ट रिटर्न प्रकार आईडी है।
फ्लोट क्षेत्र = [myRect क्षेत्र];

एक संदेश का परिणाम तुरंत दूसरे संदेश में उपयोग किया जा सकता है:
[myRect setColor: [otherRect color]];

जैसा कि पहले ही उल्लेख किया गया है, ऑब्जेक्टिव-सी में, कक्षाएं स्वयं वस्तुएं हैं। ऐसी वस्तुओं का मुख्य उद्देश्य (जिसे क्लास ऑब्जेक्ट कहा जाता है) इस वर्ग के उदाहरणों का निर्माण करना है। उसी समय, वर्ग नाम ही एक दोहरी भूमिका निभाता है - एक तरफ, यह एक डेटा प्रकार के रूप में कार्य करता है (यानी, इसका उपयोग किसी दिए गए वर्ग की वस्तुओं के लिए संकेत का वर्णन करने के लिए किया जा सकता है)। दूसरी ओर, वर्ग नाम उस वस्तु के रूप में कार्य कर सकता है जिस पर संदेश भेजा जाता है (संदेशों में, वर्ग नाम केवल एक रिसीवर के रूप में भाग ले सकता है)। ऑब्जेक्टिव-सी में बूलियन मूल्यों के लिए एक अंतर्निहित प्रकार नहीं है, इसलिए इस प्रकार को आमतौर पर कृत्रिम रूप से पेश किया जाता है। इसके बाद, मैं YES और NO (IMHO के स्पष्ट मूल्यों के साथ तार्किक मूल्यों के लिए BOOL प्रकार का अधिक स्पष्ट रूप से उपयोग करूंगा, लेकिन "राजनीतिक रूप से सही" के रूप में सही / गलत नहीं)।

नई कक्षाएं बनाना


उद्देश्य-सी में संकलक के सभी नए निर्देश @ प्रतीक से शुरू होते हैं। जैसा कि C ++ में, वर्ग और उसके कार्यान्वयन के विवरण को अलग किया जाता है (आमतौर पर विवरण को हेडर फ़ाइलों में एक्सटेंशन एच के साथ रखा जाता है, और एक्सटेंशन एम के साथ फाइलों में कार्यान्वयन)।
एक नए वर्ग का वर्णन करने के लिए सामान्य संरचना निम्नलिखित है:
@interface क्लासनेम: सुपरक्लास
{
उदाहरण चर घोषणाएं
}
विधि की घोषणा
अंत

Apple के रनटाइम संस्करण में, सभी कक्षाएं एक सामान्य पूर्वजों को साझा करती हैं - NSObject वर्ग, जिसमें कई महत्वपूर्ण विधियां शामिल हैं। चर का वर्णन C भाषा में संरचनाओं में चर के विवरण से अलग नहीं है:
@ सर्फ़ेक्ट रेक्ट: NSObject
{
फ्लोट चौड़ाई;
तैरने की ऊँचाई;
BOF भरा हुआ है;
NSColor * रंग;
}
अंत

प्रत्येक विवरण एक प्लस या माइनस साइन के साथ शुरू होता है। एक प्लस संकेत इंगित करता है कि यह विधि एक वर्ग विधि है (अर्थात, इसे केवल कक्षा ऑब्जेक्ट में भेजा जा सकता है, और इस वर्ग के उदाहरणों के लिए नहीं)। वास्तव में, वर्ग विधियां C ++ में कक्षाओं में स्थिर विधियों का एनालॉग हैं। माइनस साइन का उपयोग वस्तुओं के तरीकों को दर्शाने के लिए किया जाता है - इस वर्ग के उदाहरण। ध्यान दें कि Objective-C में सभी विधियाँ आभासी हैं, अर्थात ओवरराइड हो सकता है।

निम्नलिखित वर्ग वर्ग के लिए संभावित तरीकों का वर्णन कर रहे हैं।
@ सर्फ़ेक्ट रेक्ट: NSObject
{
फ्लोट एक्स, वाई;
फ्लोट चौड़ाई;
तैरने की ऊँचाई;
BOF भरा हुआ है;
NSColor * रंग;
}
+ newRect;
- (शून्य) प्रदर्शन;
- (फ्लोट) चौड़ाई;
- (फ्लोट) ऊंचाई;
- (फ्लोट) क्षेत्र;
- (शून्य) setWidth: (float) theWidth;
- (शून्य) setHeight: (float) theHeight;
- (शून्य) setX: (फ्लोट) theX y: (float) theY;
अंत

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

एक विधि जो मापदंडों की एक मनमानी संख्या लेती है उसे निम्नानुसार वर्णित किया जा सकता है:
- मेकग्रुप: (आईडी) ऑब्जेक्ट, ...;

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

वर्ग विधियों का कार्यान्वयन निम्नानुसार है:
#import "ClassName.h"
@ उत्थान क्लासनेम
विधि कार्यान्वयन
अंत

निम्नलिखित पहले से वर्णित रेक्ट वर्ग के तरीकों का एक उदाहरण कार्यान्वयन है।
#import "Rect.h"

@ चिंतनशील परत

+ newRect {
रेक्ट * रेक्ट = [[रेक्ट एलोकेशन] इनिट];
[रेक्ट सेटविदथ: 1.0f];
[रेक्ट सेटहाइट: 1.0f];
[रेक्ट सेटएक्स: 0.0fy: 0.0f];
}
- (फ्लोट) चौड़ाई {वापसी चौड़ाई; }
- (फ्लोट) ऊँचाई {वापसी ऊँचाई; }
- (फ्लोट) क्षेत्र {वापसी [आत्म चौड़ाई] * [आत्म ऊंचाई]; }
- (शून्य) समुच्चयबोधक: (फ्लोट )Width {चौड़ाई = theWidth; }
- (शून्य) setHeight: (float) theHeight {height = theHeight; }
- (शून्य) setX: (फ्लोट) theX y: (float) theY {
x = theX;
y = theY;
}
अंत

जैसा कि आप ऊपर दिए गए उदाहरण से देख सकते हैं, सभी उदाहरण चर तरीकों में उपलब्ध हैं। हालाँकि, C ++ की तरह, निजी , संरक्षित, और सार्वजनिक निर्देशों का उपयोग करके चर (तरीकों की दृश्यता को नियंत्रित नहीं किया जा सकता) की दृश्यता को नियंत्रित करना संभव है (C ++ भाषा के समान पूरी तरह से अभिनय)।

मैसेजिंग इंजन कैसे काम करता है


संकलक भेजे गए प्रत्येक संदेश का अनुवाद करता है, अर्थात फ़ंक्शन कॉल में प्रपत्र [ऑब्जेक्ट संदेश] का निर्माण objc_msgSend।

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

अन्यथा, ऑब्जेक्ट को अपवाद को फेंकने से पहले संदेश को संसाधित करने का अंतिम मौका दिया जाता है - पैरामीटर के साथ संदेश चयनकर्ता NSInvocation के विशेष ऑब्जेक्ट में "लिपटा" होता है और संदेश अग्रेषित किया जाता है: ऑब्जेक्ट को भेजा जाता है, जहां NSInvocation वर्ग का ऑब्जेक्ट पैरामीटर के रूप में कार्य करता है।

यदि वस्तु आगे बढ़ने का समर्थन करती है: तो, यह या तो भेजे गए संदेश को संसाधित कर सकती है या प्रसंस्करण के लिए किसी अन्य वस्तु पर भेज सकती है:
- (शून्य) अग्रेषित करें: (NSInvocation *) एनवोकेशन
{
अगर ([someOtherObject RespondsToSelector: [anvvocation selector]])
[एन्वोकेशन invokeWithTarget: someOtherObject];
अन्यथा
...
}

वस्तुओं का निर्माण और विनाश


ऑब्जेक्टिव-सी भाषा में, वस्तुओं को बनाने और नष्ट करने के लिए कोई विशेष आदेश नहीं हैं (जैसे नया और हटाना)। यह कार्य रनटाइम लाइब्रेरी के साथ है और संदेश भेजने वाले तंत्र का उपयोग करके कार्यान्वित किया जाता है।
एक नया ऑब्जेक्ट बनाना दो चरणों में विभाजित है - मेमोरी आवंटन और ऑब्जेक्ट इनिशियलाइज़ेशन। पहला चरण आबंटित वर्ग (NSObject वर्ग में लागू किया गया) की विधि द्वारा कार्यान्वित किया जाता है, जो आवश्यक मात्रा में स्मृति आवंटित करता है (इस विधि का उपयोग न केवल NSObject वर्ग की वस्तुओं के लिए स्मृति को आवंटित करने के लिए किया जाता है, बल्कि इससे प्राप्त किसी भी वर्ग के लिए भी किया जाता है)। इस स्थिति में, आवंटित की गई स्मृति शून्य होती है और संबंधित वर्ग के वर्ग ऑब्जेक्ट के लिए एक सूचक isa विशेषता को लिखा जाता है।

कृपया ध्यान दें कि आवंटित संदेश आवश्यक वर्ग के वर्ग ऑब्जेक्ट को भेजा जाता है और यह संदेश ऑब्जेक्ट के लिए आवंटित मेमोरी को एक पॉइंटर लौटाता है।

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

id anObject = [[आयत आबंटित] init];

एक नया वर्ग बनाते समय, आमतौर पर आवंटन विधि को फिर से परिभाषित करने की आवश्यकता नहीं होती है, लेकिन init विधि को फिर से परिभाषित करने की आवश्यकता काफी बार उठती है (हालांकि कई मामलों में आप आवंटित मेमोरी को शून्य पर रीसेट करने पर भरोसा कर सकते हैं)।

कृपया ध्यान दें कि इनिट विधि (एस) एक सामान्य विधि है जो बाकी से बाहर नहीं खड़ी होती है (सी ++ के विपरीत, जहां कंस्ट्रक्टर एक विशेष विधि है, जहां से उदाहरण के लिए आप पता नहीं ले सकते हैं)। इसलिए, एक नया वर्ग और init पद्धति बनाते समय, ओवरराइड इनिट विधि ([सुपर init] का उपयोग करके) को कॉल विधि के बहुत शुरुआत में स्पष्ट रूप से किया जाना चाहिए।

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

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

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

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

- (शून्य) डीललोक
{
...
[सुपर डीलॉक];
}

उद्देश्य-सी 2.0


WDC2006 में, Apple ने भाषा का एक नया संस्करण पेश किया - 2.0। इनोवेशन में कचरा कलेक्शन, तेज एन्यूमरेशन, क्लास प्रॉपर्टीज, 64-बिट सपोर्ट और बहुत कुछ शामिल थे। यह ध्यान दिया जाना चाहिए कि ये नवाचार केवल तेंदुए के लिए उपलब्ध हैं।

कचरा संग्रह


उद्देश्य-सी 2.0 स्वचालित कचरा संग्रह की अनुमति देता है, हालांकि यह वैकल्पिक है।

गुण


पहले, उदाहरण के चर को बदलने और पढ़ने के लिए, रिटर्न और सेट विधि (तथाकथित गेटर्स और सेटर) लिखना आवश्यक था, अब आप इसे लिख सकते हैं:

@ इनफ़र्टफेस पर्सन: NSObject {
}
@property (आसानी से) NSString * नाम;
@property (आसानी से) int उम्र;
- (आईडी) initWithName: (एनएसएसट्रिंग) नाम उम्र: (इंट) उम्र;
अंत

आप इस तरह नाम प्राप्त कर सकते हैं:
NSString * नाम = aPerson.name;

तेजी से जमाव


अब फॉर्च्यूमेंट स्टेटमेंट का एक एनालॉग जोड़ा गया है:
for (व्यक्ति * p inPeople) NSLog (@ "% @%% I वर्ष पुराना है", [p getName], [p getAge]);

पहले भाग के लिए पर्याप्त। लेख को संकलित करते समय, हमने साइटों developer.apple.com और steps3d.narod.ru से सामग्री का उपयोग किया (वैसे, एकमात्र साइट जिस पर रूसी में मैक ओएस एक्स में प्रोग्रामिंग के बारे में जानकारी है)।

अगले भाग में मैं Xcode विकास पर्यावरण और इंटरफ़ेस बिल्डर के बारे में बात करूँगा, साथ ही यह भी बताऊंगा कि एक बहुत ही सरल अनुप्रयोग कैसे बनाया जाए।

Source: https://habr.com/ru/post/In20992/


All Articles