आप "Creating a Singleton" iPhone देव केंद्र पर पर एक नज़र कैसे ठीक है कि पैटर्न लागू करने के लिए देखने के लिए करना चाहते हैं। आप अपने सिंगलटन को रिहा नहीं करेंगे, जब एप्लिकेशन निकलता है तो बस इसे मरने दें।
इसके अलावा, अगर आप थ्रेड रहे हैं तो आप शायद एक @synchronize (स्वयं) में है कि alloc रैप करने के लिए {}
यहाँ पूरा टेक्स्ट है चाहता हूँ:
फाउंडेशन के कुछ वर्गों और एप्लिकेशन किट सिंगलटन ऑब्जेक्ट्स बनाएं। एक "सख्त" कार्यान्वयन में, एक सिंगलटन वर्तमान प्रक्रिया में एक वर्ग का एकमात्र स्वीकार्य उदाहरण है। लेकिन क्या आप भी जबकि UIApplication फिट बैठता है, में एक और अधिक लचीला सिंगलटन कार्यान्वयन जो एक कारखाने विधि हमेशा रिटर्न एक ही उदाहरण हो सकता है, लेकिन आप आवंटित कर सकते हैं और अतिरिक्त instances.The NSFileManager वर्ग को प्रारंभ हो गया बाद इस पैटर्न पूर्व। जब आप यूआईपीप्लिकेशन के उदाहरण के लिए पूछते हैं, तो यह आपको एकमात्र उदाहरण के संदर्भ में आवंटित करता है और इसे अभी तक मौजूद नहीं है।
एक सिंगलटन वस्तु, नियंत्रण केंद्र के एक प्रकार के रूप में कार्य करता निर्देशन या वर्ग की सेवाओं का समन्वय। आपकी कक्षा एक सिंगलटन उदाहरण के बजाय कई उदाहरण उत्पन्न करनी चाहिए जब वहाँ धारणात्मक केवल एक उदाहरण (साथ , उदाहरण के लिए, NSWorkspace के रूप में)। आप कारखाने तरीकों के बजाय सिंगलटन उदाहरणों या कार्यों का उपयोग जब यह बोधगम्य है कि वहाँ कई उदाहरण एक दिन हो सकता है।
वर्तमान प्रक्रिया में एक वर्ग के एकमात्र स्वीकार्य उदाहरण के रूप में एक सिंगलटन बनाने के लिए, आप एक कार्यान्वयन लिस्टिंग 2-15 के लिए इसी तरह की आवश्यकता है। यह कोड निम्न कार्य करता है:
अपने सिंगलटन ऑब्जेक्ट का एक स्थिर उदाहरण घोषित करें और इसे शून्य पर प्रारंभ करें। कक्षा के लिए अपनी कक्षा फैक्ट्री विधि में ( "साझा किया गया" या "साझा प्रबंधक" जैसे कुछ नाम दिया गया है, कक्षा का एक उदाहरण उत्पन्न करता है लेकिन केवल स्थिर उदाहरण शून्य है। ओवरराइड allocWithZone: को विधि सुनिश्चित करना है कि एक और उदाहरण किसी वर्ग कारखाने विधि का उपयोग कर के आबंटित कर अपने वर्ग का एक उदाहरण प्रारंभ करने के बजाय सीधे कोशिश करता है तो नहीं आवंटित है। इसके बजाय, बस साझा ऑब्जेक्ट को वापस करें। कार्यान्वयन बेस प्रोटोकॉल विधियों कॉपीविथज़ोन: रिलीज, बनाए रखने, retainCount, और को सिंगलटन स्थिति सुनिश्चित करने के लिए उचित चीजों को करने के लिए स्वत: बदलें। (इन तरीकों के अंतिम चार, स्मृति-प्रबंधित कोड के लिए लागू कचरा-एकत्र कोड के लिए नहीं।) लिस्टिंग की 2-15 सख्त कार्यान्वयन एक सिंगलटन स्थिर MyGizmoClass
*sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager {
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}
return sharedGizmoManager; }
+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedManager] retain]; }
- (id)copyWithZone:(NSZone *)zone {
return self; }
- (id)retain {
return self; }
- (NSUInteger)retainCount {
return NSUIntegerMax; //denotes an object that cannot be released }
- (void)release {
//do nothing }
- (id)autorelease {
return self; }
आप तो एक सिंगलटन इंस्टेंस (बनाया गया और क्लास फैक्ट्री विधि द्वारा नियंत्रित) है, लेकिन की क्षमता भी आवंटन और प्रारंभिकरण के माध्यम से आवश्यक अन्य उदाहरण बनाएं, allocWith को ओवरराइड न करें जोन: और लिस्टिंग 2-15 में दिखाए गए अनुसार अन्य विधियों का पालन करें।
अद्यतन: अब एक बहुत आसान आप @syncronize
बारे में चिंता करने की जरूरत नहीं है इस नई शैली का उपयोग करते हुए एक सिंगलटन
+ (MyClass*)sharedInstance
{
static MyClass* _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[MyClass alloc] init];
});
return _sharedInstance;
}
बनाने के लिए जिस तरह से या स्मृति प्रबंधन अधिभावी है तरीकों।
ध्यान दें कि आप एक सिंगलटन एक बात है, तो यह करने के लिए एक अच्छा विचार हो सकता सफाई विधि किसी तरह का, कि आवेदन प्रतिनिधि द्वारा कहा जा सकता है है जब यह कम स्मृति चेतावनी हो जाता है। आप उस समय पूरी स्थैतिक वस्तु को भी डंप कर सकते हैं और सृजन बहुत महंगा नहीं होने पर इसे फिर से बनाया जा सकता है। –