23

त्वरित सवाल ... खैर मैं समझता हूँ कि सभी गुण ऑब्जेक्टिव-सी में नहीं के बराबर के रूप में बाहर शुरू करने और है कि शून्य को कोई संदेश भेजने कुछ नहीं करता है, इसलिए आप [[क्लास alloc का उपयोग कर प्रारंभ करना होगा ] इस में]; एक नव निर्मित संपत्ति को संदेश भेजने से पहले। हालांकि, अगर मैं इस संपत्ति में संदेश नहीं भेज रहा हूं या यदि मैं self.property = कुछ का उपयोग कर संपत्ति सेट करता हूं तो क्या होगा? क्या मुझे इन मामलों में भी प्रवेश करने की ज़रूरत है? साथ ही, क्या UI गुण भी शून्य के रूप में शुरू होते हैं, जैसे UILabel प्रॉपर्टी जिसे आप अपने स्टोरीबोर्ड से खींचते हैं? इन सभी को आवंटित करने की ज़रूरत है?लेज़ी इन्स्टेन्शियशन

सभी जो जवाब देने

+1

+1 बहुत अच्छा सवाल है। ओजबसी शुरुआती लोगों के लिए अभी तक आवंटित/इनिट संपत्ति को संदेश भेजना एक आम गलती है। – Philip007

उत्तर

2

वास्तविकता जब आप self.myProperty = [[Class alloc] init] करते हैं, आप अपनी संपत्ति आरंभ नहीं कर रहे है के लिए धन्यवाद। इसके बजाय, आप किसी ऑब्जेक्ट को प्रारंभ कर रहे हैं जिसे आप इंगित करने के लिए अपनी संपत्ति (जो वास्तव में एक सूचक है) बताते हैं। तो यदि आपके पास पहले से ही एक ऑब्जेक्ट है जिसे आवंटित और प्रारंभ किया गया है, तो आपको फिर से आवंटित/इनिट करने की आवश्यकता नहीं है और आप self.myProperty = object कर सकते हैं;

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

मुझे आशा है कि यह सहायक होगा।

0

नहीं, आपको [in class alloc] अपनी init विधि में गुणों को init करने की आवश्यकता नहीं है।

हालांकि, मैं स्पष्ट रूप से स्पष्टता के लिए अपने init विधि में शून्य करने के लिए उन्हें स्थापित करने के लिए प्रोत्साहित करते हैं।

1

मैं स्टोरीबोर्ड उन के साथ अनुभव नहीं है, लेकिन मुझे पता है कि आप एक xib फ़ाइल सभी वस्तुओं को ठीक से instantiated कर रहे हैं जब आप एक xib फ़ाइल का उपयोग करने की दृष्टि नियंत्रक बता के माध्यम से वस्तुओं को बनाने के लिए जब। तो आपको कोड में उन ऑब्जेक्ट्स को आवंटित/इनसाइट करने की चिंता करने की आवश्यकता नहीं है।

self.property = <something> का उपयोग करने के संबंध में, यह something पर निर्भर करता है। अगर किसी मौजूदा वस्तु का कोई भी प्रकार है तो आपको उस ऑब्जेक्ट पर आवंटित एटिट नहीं करना चाहिए क्योंकि self.property = ... सिंटैक्स संपत्ति की सेटर विधि को कॉल करता है जो संपत्ति को नए मूल्य को बनाए रखे, प्रतिलिपि, असाइन, इत्यादि रखेगा।

अब किसी भी प्रकार का मौजूदा ऑब्जेक्ट एक आवंटित/init'ed ऑब्जेक्ट हो सकता है, या सुविधा विधि से प्राप्त एक ऑटोरेलेज्ड ऑब्जेक्ट (उदाहरण के लिए NSString की स्ट्रिंग WithFormat:)।

Kaan Dedeoglu के रूप में बाहर, स्मृति में वस्तु को इवर बताया self.property = ... वाक्य रचना अंक (और बरकरार रखती है), और यह आप पर निर्भर है कि वस्तु प्रारंभ करने में यदि वह पहले से instantiated नहीं है।

34

स्टनर नहीं समझा वस्तुओं कि पहले से ही बनाया गया है init alloc करने की जरूरत का एक अच्छा काम किया है।

लेकिन यदि यह एक वस्तु है जो अस्तित्व में नहीं है, तो आप इसे कहां बनाने जा रहे हैं? एक बहुत ही सामान्य पैटर्न, जिसका मैं उल्लेख करता हूं क्योंकि आपने इसे अपनी पोस्ट में उल्लेख किया है, आलसी तत्काल है।

तो आप एक एनएसएमयूटेबलएरे संपत्ति चाहते हैं। आप इसका उपयोग करने से पहले इसे किसी विधि में आवंटित कर सकते हैं, लेकिन फिर आपको चिंता करना होगा "क्या मुझे अपनी सरणी की आवश्यकता होने से पहले उस विधि को बुलाया जाता है?" या "क्या मैं इसे फिर से गलती से कॉल करने जा रहा हूं और इसे फिर से शुरू कर दूंगा।"

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

.h 
@property (nonatomic, strong) NSMutableArray* myArray; 

.m 
@synthesize myArray = _myArray; 

- (NSMutableArray*)myArray 
{ 
    if (!_myArray) { 
     _myArray = [[NSMutableArray alloc] initWithCapacity:2]; 
    } 
    return _myArray; 
} 

आप का उपयोग है कि संपत्ति है, यह कहते हैं, हर बार जब "मौजूद myArray? यदि नहीं, तो यह पैदा करते हैं। यह है, बस मैं क्या है वापस नहीं आ जाते है।"

प्लस इस डिज़ाइन पैटर्न के साथ एक अतिरिक्त लाभ यह है कि आप संसाधनों को तब तक नहीं बना रहे हैं जब तक आपको उनकी आवश्यकता न हो, बनाम उन्हें एक बार में बनाते हुए कहें, जब आपका व्यू कंट्रोलर लोड हो या आपका ऐप लॉन्च हो, जो आवश्यकताओं के आधार पर, कुछ सेकंड ले सकता है।

+4

अच्छी प्रतिक्रिया, लेकिन मैं गेटर्स में तत्काल आइवरों से असहमत हूं क्योंकि इससे वस्तु के अस्तित्व के लिए पूछताछ की जा सकती है। इसके बजाय, मैं अनुशंसा करता हूं कि आप सेटटर में तत्कालता करें क्योंकि आप निश्चित रूप से जानते हैं कि यदि आप जिस ivar को सेट कर रहे हैं, वह मौजूद नहीं है, तो आप इसे अस्तित्व में रखना चाहते हैं ताकि इसे किसी मान पर सेट किया जा सके। इसलिए, ऐसा कोई समय नहीं होगा जहां आप एक सेटटर को कॉल करते समय अस्तित्व में नहीं रहना चाहेंगे, जबकि एक गेटर को कॉल करते समय, यह हमेशा मामला नहीं होता है। – Stunner

+0

यदि मैं इसे इतनी देर से जोड़ सकता हूं ... क्या आपको इसे सेटर में जोड़ना होगा यदि संपत्ति में 'प्रतिलिपि' विशेषता है क्योंकि इसे पहले से ही एक प्रतिलिपि उपयोग करने के लिए मिल जाएगी? – ScottyB

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