दिलचस्प पोस्ट
संख्याओं की सूची को उपयोगकर्ता से इनपुट के रूप में प्राप्त करें जावा का उपयोग कर स्प्लिट 1 जीबी एक्सएमएल फाइल पायथन सूची चर परिवर्तन को प्रतिबिंबित नहीं करती है दिनांक को कैसे पार्स करना है? एंड्रॉइड ऐप में पृष्ठभूमि का रंग कैसे बदल सकता है एंड्रॉइड के साथ HTTPS GET (SSL) और स्व-हस्ताक्षरित सर्वर प्रमाण पत्र जब जेएमएक्स कॉन्फ़िगर किया गया तो जावा क्यों 3 बंदरगाह खोलता है? पायथन सबप्रोसेस फ़ाइल और टर्मिनल में बच्चों के आउटपुट को प्राप्त करता है? सी # परीक्षा अगर उपयोगकर्ता ने किसी फ़ोल्डर में प्रवेश लिखना है स्ट्रिंग से पहले 5 अक्षर कैसे प्राप्त करें Jquery कोड को जावास्क्रिप्ट में बदलने का एक आसान तरीका है? मैं एक जीआईटी रिबेस के लिए एक मर्ज रणनीति कैसे चुनूं? मैं दो कमानों को एक में कैसे मिला सकता हूं? कैसे WinDbg में प्रतीकों को सेट करने के लिए? PHP सरणी एकाधिक प्रकार – मूल्य से फिर कुंजी के द्वारा?

alloc और init वे वास्तव में क्या करते हैं

क्या कोई मुझे बता सकता है कि ओबजे-सी में क्या init और alloc करते हैं मैं इस obj-c पुस्तक पढ़ रहा हूँ जो ऑब्जेक्ट बनाने का एक उदाहरण देता है लेकिन यह वास्तव में इसके बारे में जानकारी नहीं देता है कि यह क्या करता है। आलोक क्या है? init वापसी क्या करता है?

Animal * k = [Animal alloc]; k = [k init]; 

वेब के समाधान से एकत्रित समाधान "alloc और init वे वास्तव में क्या करते हैं"

  • आबंटन ऑब्जेक्ट को पकड़ने के लिए मेमोरी का एक हिस्सा आवंटित करता है, और सूचक देता है।

     MyClass* myObj = [MyClass alloc]; 

    myObj अभी तक उपयोग नहीं किया जा सकता, क्योंकि इसकी आंतरिक स्थिति सही ढंग से सेटअप नहीं है तो, इस तरह एक कोड नहीं लिखें

  • init ऑब्जेक्ट की प्रारंभिक स्थिति को सेट करता है और इसे वापस देता है ध्यान दें कि [a init] द्वारा जो वापस लौटाया गया है वह a से भिन्न हो सकता है यह बताता है कि येनिक ने लिखा है:

     -init{ self=[super init]; // 1. if(self){ // 2. .... } return self; // 3. } 
    1. सबसे पहले, आपको सुपरक्लास के इनिट को कॉल करने की ज़रूरत है, सुपरक्लास के इंस्टेंस वैरिएबल आदि को सेट करने के लिए। यह कुछ ऐसे मूल के मूल के बराबर नहीं लौटा सकता है, इसलिए आपको self को वापस लौटाए जाने के लिए आवंटित करना होगा।
    2. यदि self गैर-शून्य है, तो इसका अर्थ है कि सुपर क्लास द्वारा नियंत्रित भाग सही रूप से आरंभ किया गया है। अब आप अपना इनिशियलाइजेशन करते हैं सभी आवृत्ति चर nil करने के लिए सेट हैं (यदि यह ऑब्जेक्ट है) और 0 अगर यह पूर्णांक है आपको अतिरिक्त प्रारंभिक सेटिंग करने की आवश्यकता होगी
    3. सेट अप self लौटें लौटा self क्या आवंटित से अलग हो सकता है! इसलिए, आपको अपने वैरिएबल में init का परिणाम आवंटित करना होगा।

यह सुझाव एक महत्वपूर्ण सबक: alloc और init लिए कॉल को कभी भी विभाजित नहीं किया गया। लिखना न करें:

  MyClass* myObj = [MyClass alloc]; [myObj init]; 

क्योंकि [myObj init] कुछ और वापस लौट सकता है लिखकर इस बारे में जानने की कोशिश न करें:

  MyClass* myObj = [MyClass alloc]; myObj=[myObj init]; 

क्योंकि आप अंततः दूसरी लाइन में भाग myObj= लिखना भूल जाएंगे।

हमेशा लिखें:

  MyClass* myObj = [[MyClass alloc] init]; 

मैं भी लिखने की अनुशंसा नहीं करता हूं:

  MyClass* myObj = [MyClass new]; 

क्योंकि यह आरंभीकरण विधि को सही तरीके से कॉल नहीं करता है: कुछ वर्ग एक सादे init स्वीकार नहीं करते हैं। उदाहरण के लिए, NSView को initWithFrame: आवश्यकता है, जो new साथ नहीं बुलाया जा सकता। तो, new उपयोग न करें।

अपने सरल रूप में:

  • alloc: आवंटन के लिए कम, एक स्मृति स्थान reservers और उस स्मृति स्थान पर सूचक देता है। इस सूचक को फिर k चर में संग्रहीत किया जाता है।

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

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

 - (Schedule*)init { self = [super init]; if (self) { channels = [[NSMutableArray alloc] initWithCapacity:0]; } return self; } 

alloc और init दो तरीके हैं जो NSObject से विरासत में मिल रहे हैं आप अपनी स्वयं की विधियों को प्रदान कर सकते हैं या एनएसओबीके से कॉल कर सकते हैं

आबंटन आपके क्लास (@ इंटरफेस) init के एक नए इंस्टेंस को बनाने के लिए आबंटित करता है उस उदाहरण की सामग्री को आरंभ करता है, डिफ़ॉल्ट रूप से इनिट सभी सदस्य मानों को 0 / nil में सेट करता है, लेकिन आप जो किया गया है उसे अनुकूलित करने के लिए अपनी खुद की init विधि बना सकते हैं।

 Animal * k = [[Animal alloc] init]; // creates a new Animal object 

आप भी लिख सकते हैं

 Animal * k = [Animal new]; // which would be a bit more similar to other languages 

NSObject रूट वर्ग एक क्लास विधि, आवंटित , आबंटन प्रदान करता है : एक स्मृति स्थान को रीसर्वर्स और पॉइंटर को उस मेमोरी स्थान पर लौटाता है।

एलोॉक विधि में एक अन्य महत्वपूर्ण कार्य है, जो ऑब्जेक्ट के गुणों के लिए आवंटित स्मृति को शून्य में सेट करके साफ़ करना है।

इससे पहले जो कुछ भी संग्रहीत किया गया था, उसमें से कचरा युक्त स्मृति की सामान्य समस्या से बचा जाता है, लेकिन यह है

एक वस्तु को पूरी तरह से प्रारंभ करने के लिए पर्याप्त नहीं है

आपको एओएल को कॉल के साथ कॉल करने के लिए एक अन्य एनएसओबीक्स्ट विधि को जोड़ना होगा :

  • (आईडी) init; Init पद्धति का प्रयोग एक वर्ग द्वारा किया जाता है यह सुनिश्चित करने के लिए कि उसके गुणों में सृजन पर प्रारंभिक मूल्य मिलते हैं। किसी ऑब्जेक्ट को आवंटित करने और आरंभ करने का सही तरीका यह है कि कॉल के अंदर alloc कॉल को अंदर से कॉल करना, जैसे:

    कक्षा नाम * वस्तुनाम = [क्लासनाम एलोक] init];

से: सेब दस्तावेज़

Alloc वस्तु के लिए स्मृति आवंटित करेगा, लेकिन Init ऑब्जेक्ट को स्मृति में डालता है और डिफ़ॉल्ट मान सेट करता है।