2017-11-18 12 views
5

मैं एक नौसिखिया हूं और मैं आलसी बनाम बनाम समझता हूं। मैंने देखा है कि आलसी Var का उपयोग करते समय यह विशेष रूप से ImageViews के साथ स्मृति उपयोग का एक टन बचाता है। लेकिन अब तक देखे गए ट्यूटोरियल और मार्गदर्शिकाएं आलसी बार का उपयोग नहीं करती हैं, इसलिए मुझे संदेह है कि यह बुरा अभ्यास है और मैं कुछ दिख रहा हूं।स्विफ्ट - आलसी बनाम बनाम चलो प्रोग्रामेटिक रूप से दृश्य बनाते समय (स्मृति की बचत)

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

आलसी बनाम बनाते समय यह ठीक (या बेहतर) कब होता है जब UIView बनाते हैं?

lazy var profileImageView: UIImageView = { 

    let imageView = UIImageView(image: #imageLiteral(resourceName: "page1")) 
    imageView.translatesAutoresizingMaskIntoConstraints = false 
    imageView.contentMode = .scaleAspectFit 
    return imageView 

}() 
+0

यहां एक पुराना है (स्विफ्ट 1 दिखता है) स्पष्टीकरण कि 'आलसी var' क्या है। विशेष रूप से इसका उपयोग करने के लिए अनुभाग को देखें: http://mikebuss.com/2014/06/22/lazy-initialization-swift/ अब, अपने प्रश्न के दाईं ओर कॉलम में तीन संबंधित लिंक देखकर * सुझाव * वे आपके जैसा ही हैं, मुझे लगता है कि कोई भी * वास्तव में * प्रश्न का उत्तर नहीं देता - जैसे उपरोक्त लिंक - * * प्रत्येक का उपयोग कब करें। वे या तो समझाते हैं कि 'आलसी' क्या है (और आपको 'var' का उपयोग क्यों करना है या क्यों कुछ नहीं बनाया गया है। मैं उम्मीद कर रहा हूं कि कोई यहां आपको एक अच्छे प्रश्न का अच्छा जवाब दे सकता है – dfd

उत्तर

2

चाहे आप lazy var का उपयोग करेंगे या नहीं, आपके कोड और उसके संदर्भ पर निर्भर करता है। यह अपने आप पर बुरा या अच्छा नहीं है। आपको यह तय करना होगा कि यह कब उचित है।

इससे पहले कि आप इसे तय कर सकें, आपको पता होना चाहिए कि lazy var क्या है।

lazy var क्या है?

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

आलसी प्रारंभिकरण के पीछे प्राथमिक ड्राइव है। जब तक आपको इसकी आवश्यकता न हो तब तक आप कुछ नहीं बनाते। यह भी तर्क है कि आप यह तय करते समय उपयोग करेंगे कि कुछ lazy var होना चाहिए या नहीं।

यदि आप विचारों (या कुछ और) से निपट रहे हैं जो हमेशा दिखाई दे रहे हैं (आवश्यक) आलसी प्रारंभिकरण का उपयोग करने में थोड़ा सा बिंदु है। दूसरी ओर जब आप ऐसे मामलों से निपट रहे हैं जिनकी हमेशा आवश्यकता नहीं होती है - तो lazy var का उपयोग करना उचित है।

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


जहां तक ​​थ्रेड सुरक्षा का संबंध है, lazy var स्विफ्ट में सुरक्षित नहीं हैं।

इसका मतलब है कि यदि दो अलग-अलग धागे एक ही समय में उसी lazy var तक पहुंचने का प्रयास करते हैं, तो इस तरह के चर को प्रारंभ करने से पहले यह संभव है कि धागे में से एक आंशिक रूप से निर्मित उदाहरण तक पहुंच सके। एक lazy var अपने कोड की पठनीयता सुधार हो रहा है का उपयोग करने के

Swift - is lazy var thread-safe?

Make "lazy var" threadsafe

2

एक और लाभ यह:

आप में धागा सुरक्षा के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

आपके उदाहरण में, छवि दृश्य से संबंधित कोड को प्रारंभकर्ता, सेटअप फ़ंक्शन या viewDidLoad पर फैलाने के बजाय एक साथ समूहीकृत किया गया है।यह कोड के पाठक को कोड में विभिन्न स्थानों पर उद्यम करने की आवश्यकता नहीं होने के कारण स्थानीय तर्क को बेहतर बनाता है ताकि यह समझ सके कि आपका दृश्य कैसा कॉन्फ़िगर किया गया है। अपने विचार के बारे में जानने के लिए, उन्हें केवल अपनी घोषणा पर कूदने की आवश्यकता है।

lazy var के रूप में चिह्नित एक प्रारंभिक बंदरगाह self तक पहुंच सकता है, जिससे बंद करने के अंदर अधिक कॉन्फ़िगरेशन की अनुमति मिलती है, जैसे लक्ष्य क्रियाएं जोड़ना या अन्य निरंतर गुणों का संदर्भ देना।

मैं गुणों (विशेष रूप से विचार) को lazy var के बंद होने के साथ शुरू करने पर विचार करता हूं, और यह स्विफ्ट समुदाय में भी लोकप्रियता प्राप्त कर रहा है।

प्रोजेक्ट के आधार पर, डेवलपर समय बचाने से सिस्टम मेमोरी को बचाने से कहीं अधिक मूल्यवान हो सकता है।

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