आईओएस साक्षात्कार तैयारी 5 - सिंगलटन

May 04 2023
सिंगलटन पैटर्न एक डिज़ाइन पैटर्न है जो यह सुनिश्चित करता है कि एक वर्ग के पास केवल एक उदाहरण है, और उस उदाहरण के लिए वैश्विक पहुँच प्रदान करता है। यह तब उपयोगी हो सकता है जब किसी ऐप के कई हिस्सों में एक वर्ग को साझा करने की आवश्यकता होती है, लेकिन कक्षा के कई उदाहरण बनाना व्यावहारिक या वांछनीय नहीं है।

सिंगलटन पैटर्न एक डिज़ाइन पैटर्न है जो यह सुनिश्चित करता है कि एक वर्ग के पास केवल एक उदाहरण है, और उस उदाहरण के लिए वैश्विक पहुँच प्रदान करता है। यह तब उपयोगी हो सकता है जब किसी ऐप के कई हिस्सों में एक वर्ग को साझा करने की आवश्यकता होती है, लेकिन कक्षा के कई उदाहरण बनाना व्यावहारिक या वांछनीय नहीं है। IOS में, सिंगलटन पैटर्न आमतौर पर इस्तेमाल किया जाने वाला डिज़ाइन पैटर्न है।

साक्षात्कार के प्रश्न

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

सिंगलटन के साथ एक लगातार चिंता यह है कि अक्सर वे थ्रेड-सुरक्षित नहीं होते हैं। वे अक्सर सिंगलटन इंस्टेंस को एक साथ एक्सेस करने वाले कई नियंत्रकों से उपयोग किए जाते हैं।

सिंगलटन बनाते समय आपको दो बातों पर विचार करना होगा

  • उदाहरण थ्रेड सुरक्षा तरीके से बनाया जाना चाहिए
  • अधिक उदाहरण बनाने से रोकने के लिए आपको कक्षा की init विधि को निजी के रूप में चिह्नित करना चाहिए
  • सिंगलटन उदाहरण के प्रारंभ के दौरान।
  • पढ़ने के दौरान और उदाहरण के लिए लिखता है।

स्विफ्ट में सिंगलटन पैटर्न को लागू करने के लिए, जिस वर्ग को सिंगलटन होने की आवश्यकता होती है, उसे staticकीवर्ड के साथ परिभाषित किया जाता है, जो इंगित करता है कि कक्षा में केवल एक उदाहरण है। क्लास के इंस्टेंस को स्टोर करने के लिए एक स्टैटिक वेरिएबल का उपयोग किया जाता है, और इंस्टेंस को एक्सेस करने के लिए एक स्टैटिक मेथड का उपयोग किया जाता है। यहाँ स्विफ्ट में सिंगलटन क्लास का एक उदाहरण दिया गया है

class Singleton {
		// Swift guarantees initialization is atomic
		// Swift treats the code performing initialization as a critical section
    static let shared = Singleton()
    
    // prevents the creation of additional instances of the class.
    private init() {}
}

let singleton = Singleton.shared

@implementation MySingleton

// Lazy initializer 
+ (instancetype)sharedInstance {
    static dispatch_once_t once;
    static id sharedInstance;
  // The token ensures that init is executed only once in thread safety manner
    dispatch_once(&once, ^{
        _sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}
// Prevent creating new instance of the singleton
- (instancetype)init __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
+ (instancetype)new __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
@end

पेशेवरों

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

प्रति खाता 1 की गारंटी है (प्रति ऐप एक की गारंटी के बजाय)। पहुंच वैश्विक नहीं है (आपको उपयोगकर्ता सत्र की आवश्यकता है)। सिंगलटन के समान, आलसी रूप से पहली पहुंच पर बनाया गया, वही उदाहरण हमेशा बाद में लौटाया जाता है। उदाहरण के लिए MyUserSession, तब बनाया जाता है जब एक प्रमाणित उपयोगकर्ता एक सत्र शुरू करता है। इसे किसी भी कोड में इंजेक्ट किया जाना चाहिए जिसमें उपयोगकर्ता डेटा हो