2012-05-24 10 views
26

मैंने सुना है कि आईओएस में वस्तुओं की आलसी तात्कालिकता काफी आम है, हालांकि मुझे बिल्कुल यकीन नहीं है कि मुझे इसका उपयोग कब करना चाहिए? क्या कोई आलसी तत्कालता का उपयोग करना चाहिए और जब मुझे अपनी संपत्तियों को init विधि में प्रारंभ करना चाहिए, तो क्या कोई संक्षिप्त विवरण दे सकता है?आईओएस में आलसी तत्कालता का उपयोग कब करें?

आलसी इन्स्टेन्शियशन के बारे में मेरी चिंता का विषय है कि यह एक (बस यह सब लिख init विधि में की तुलना में) कोड की बहुत आवश्यकता है, खासकर यदि आप प्रारंभ करने में कई गुण होते हैं है।

+0

इसे init में करने की तुलना में बहुत सारे कोड की आवश्यकता कैसे होती है? यह आम तौर पर –

+0

में चीजों को करने से ज़्यादा नहीं जोड़ता है, यह छोटी परियोजनाओं और नए उपकरणों के साथ समझ में नहीं आता है। यदि आप स्मृति के बारे में चिंतित हैं, तो आपको आलसी तात्कालिकता का उपयोग करना होगा। – ymutlu

+0

@ymutlu क्या आप समझा सकते हैं कि यह छोटी परियोजनाओं और नए उपकरणों के साथ क्यों समझ में नहीं आता है? –

उत्तर

18

मेरी टिप्पणी पर विस्तार से बता दें। कभी-कभी यह तकनीक अच्छी होती है यदि आपके पास कोई ऑब्जेक्ट है जिसे केवल एक बार कॉन्फ़िगर करने की आवश्यकता है और इसमें कुछ कॉन्फ़िगरेशन शामिल है कि आप अपनी init विधि को अव्यवस्थित नहीं करना चाहते हैं।

- (UIView *)myRoundedView; 
{ 
    if (!_myRoundedView) { 
     _myRoundedView = [[UIView alloc] initWithFrame:<#some frame#>]; 
     _myRoundedView.layer.cornerRadius = 10.f; 
     _myRoundedView.backgroundColor = [UIColor colorWithWhite:0.f alpha:0.6f]; 
     _myRoundedView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    } 
    return _myRoundedView; 
} 

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

11

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

इसके साथ ही कहा, तुम समय से पहले अनुकूलन से बचना चाहिए। प्रदर्शन के साथ मदद करने के लिए जटिल कोड लिखने में बहुत समय व्यतीत न करें जब तक कि आपने चीजों को स्पष्ट तरीके से नहीं किया है, एक प्रदर्शन समस्या पाई है, और इस मुद्दे को पूरी तरह से समझने के लिए अपना कोड प्रोफाइल किया है। ऐसा करने के बाद, आप चीजों को बेहतर बनाने के लिए परिवर्तन करना शुरू कर सकते हैं।

13

यह स्थितियों में, जहां आप वस्तुओं एक बड़ा स्मृति पदचिह्न हो सकता है है में अच्छा है, तो आप कंटेनर वर्ग प्रारंभ के समय इन सभी महंगी वस्तुओं प्रारंभ करने से बच सकते हैं। लेज़ी आरंभीकरण कई स्थितियों में स्मृति की खपत की रक्षा कर सकते हैं ...

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

यदि आपके पास कक्षा के अंदर वैकल्पिक वस्तुएं हैं जो सभी वर्ग वर्कफ़्लो के दौरान प्रारंभ नहीं की जा सकती हैं, तो आलसी प्रारंभिकता का उपयोग किया जाना चाहिए।

3

न केवल स्मृति और प्रदर्शन के लिए, बाहर इस जाँच, यहाँ एक और उदाहरण है:

- (NSArray *)validElements{ 
    if (!_validElements) { 
     _validElements = [[NSArray alloc] initWithObjects: 
          @"mystuff",@"generaldescription",@"title",@"autor", 
          @"version",@"date",@"context",@"operatingsystem",@"kindofdevice", 
          @"deviceversion",@"rule",@"daytime",@"time",@"location",@"deviceheading", 
          @"region",@"language",nil]; 
    } 
    return _validElements; 
} 

आप एक कस्टम init या विशेष विन्यास करने के लिए आलसी इन्स्टेन्शियशन उपयोग कर सकते हैं और हाँ भी इस स्मृति और निष्पादन को लाभ पहुंचाता।

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