दिलचस्प पोस्ट
आपके होस्ट मशीन में सॉफ़्टवेयर द्वारा एक स्थापित कनेक्शन निरस्त कर दिया गया था फिर से यात्रा करते समय एक सरणी तालिका से वस्तुओं को सुरक्षित रूप से निकालें सी ++ wchar_t और wstrings के साथ "गलत" क्या है? विस्तृत वर्णों के कुछ विकल्प क्या हैं? आवेदन वर्ग में मैनिफ़ेस्ट रजिस्टर करें? एंड्रॉइड केस्टस्टोर फ़ाइल क्या है, और इसके लिए क्या उपयोग किया जाता है? किसी ऑब्जेक्ट में संलग्न होना क्या कोई CSS3 एनीमेशन पूरा होने पर एक कॉलबैक है? NSCopying को कार्यान्वित करना एनएटी में एक बिट सरणी में int को परिवर्तित करें Unique_ptr के साथ एक क्लास के लिए कन्वर्टर कॉपी करें मैं PHP में ऑब्जेक्ट की एक प्रति कैसे बनाऊं? छवि चित्र बॉक्स को सी # पर अधिलेखित करें Angular2 में कोष्ठक, ब्रैकेट और तारों में अंतर क्या है? फोन पर Google Play स्टोर ऐप में "इस ऐप का रेट करें" लिंक सपाट जेसन से जेनरेट करें (बहुस्तरीय) flare.json डेटा प्रारूप

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

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

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

Solutions Collecting From Web of "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 ऑब्जेक्ट को स्मृति में डालता है और डिफ़ॉल्ट मान सेट करता है।