2010-07-25 9 views
46

के बारे में iPhone प्रोग्रामिंग इस तरह की कक्षाओं को दर्शाता है के लिए एक किताब:alloc, init, और नए ऑब्जेक्टिव-सी में

[[Class alloc] init] 

ऑब्जेक्टिव-सी के बारे में एक किताब इस तरह यह करता है:

[Class new] 

क्या है अंतर?

+0

'[एनएसएमयूटेबल डिक्शनरी] के बारे में क्या;' – abhi1992

उत्तर

67

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

असल में, नया पुराना और लगभग-लेकिन-काफी नहीं है - इस प्रकार आप देखेंगे कि कोको कक्षाओं में बहुत सारी init विधियां हैं लेकिन लगभग कभी भी कोई कस्टम नई विधियां नहीं हैं।

+ (id) new 
{ 
    return [[self alloc] init]; 
} 

अधिक, न कम:

+30

क्या आप दिखा सकते हैं या उद्धृत कर सकते हैं कि + नया "लगभग-लेकिन-काफी नहीं है"। सहयोगियों के साथ चर्चा करने से पहले मैं जानकारी लेना चाहता हूं। – acarlow

+2

मैं इसे शॉर्टकट के रूप में उपयोग करता हूं जब मुझे बस इतना करना नहीं है कि 'alloc'/'init' पर कॉल करें। – Rivera

+0

[एनएसएमयूटेबल डिक्शनरी] के बारे में क्या; – abhi1992

2

यह कक्षा पर निर्भर करता है, लेकिन [Class new] सबसे अधिक संभावना है कि सुविधा सुविधा [[Class alloc] init] आंतरिक रूप से कॉल करें। इस प्रकार, आप अन्य init विधियों जैसे "initWithString" को कॉल नहीं कर सकते हैं।

+1

"alloc" एक नया मेमोरी लोकेशन बनाता है लेकिन इसे "नया" की तुलना में प्रारंभ नहीं करता है। –

13

जैसा कि पहले ही उल्लेख किया गया है, डिफॉट द्वारा कोई फर्क नहीं पड़ता है। लेकिन आप new कक्षा विधि को ओवरराइट कर सकते हैं। Apple's documentation इस पर कुछ विचार है।

विपरीत alloc, नई कभी कभी उपवर्गों में फिर से लागू किया आह्वान करने के लिए एक वर्ग विशेष के प्रारंभ विधि है [...] अक्सर नई ... तरीकों की तुलना में अधिक हो जाएगा बस आवंटन और प्रारंभिकरण।

+2

मुझे आपके लिंक में अंश नहीं दिखाई देता है। क्या आप अपना स्रोत साइट कर सकते हैं? – acarlow

+0

जाहिर है, ऐप्पल ने दस्तावेज़ों को अद्यतन किया है और उस अनुच्छेद को हटा दिया है। आप वेब पर पुराने संस्करणों की प्रतियां प्राप्त कर सकते हैं (कॉपीराइट के बारे में निश्चित नहीं ...) – user123444555621

70

+new के रूप में काफी सचमुच कार्यान्वित किया जाता है। कक्षाएं इसे ओवरराइड कर सकती हैं, लेकिन यह +fooWithBar: जैसे कुछ करने के पक्ष में अत्यधिक असामान्य है।

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