2011-01-05 26 views
5

मैं एक सिंगलटन इस तरह की स्थापना की है:इंटरफ़ेस बिल्डर में सिंगलटन का उपयोग करें?

static Universe *instance; 

+ (Universe *)instance { return instance; } 

+ (void)initialize 
{ 
    static BOOL initialized = NO; 
    if(!initialized) 
    { 
     initialized = YES; 
     instance = [[Universe alloc] init]; 
    } 
} 

- (id) init 
{ 
    self = [super init]; 
    if (self != nil) { 
     self.showHistory = YES; 
    } 
    return self; 
} 

लेकिन अब मुझे पता है कि मैं इंटरफ़ेस बिल्डर से यह दृष्टांत करना चाहते हैं। मैं सिर्फ इतना

if (instance) 
     return instance; 

तरह init विधि में काटने की सोच रहा था कि यह एक बुरा विचार है? मैं आईबी को +initialize विधि में पहले से बनाए गए उदाहरण को चुनने के लिए पसंद करूंगा।

उत्तर

6

यह किया जा सकता है। इसके बारे में कोको डिजाइन पैटर्न में बक और यॉटमैन द्वारा इसके बारे में एक अनुभाग है।

अपने मामले में आप की तर्ज पर कुछ कर सकते हैं:

static Universe *instance; 

+ (Universe *)instance { return instance; } 

+ (id)hiddenAlloc 
{ 
    return [super alloc]; 
} 

+ (id)alloc 
{ 
    return [[self instance] retain]; 
} 

+ (void)initialize 
{ 
    static BOOL initialized = NO; 
    if(!initialized) 
    { 
     initialized = YES; 
     instance = [[Universe hiddenAlloc] init]; 
    } 
} 

- (id)init 
{ 
    if(instance==nil) // allow only to be called once 
    { 
    // your normal initialization here 
    } 
    return self; 
} 

निब लदान कोड तो सही ढंग से सिंगलटन अपने कॉल के माध्यम से [[Universe alloc] init] को ले जाएगा, और आप अभी भी रूप में अपने कोड में instance उपयोग कर सकते हैं पहले।

किताब और अधिक विस्तार है और new और allocWithZone (दोनों बस return [self alloc]; के रूप में), प्लस त्रुटि रिपोर्टिंग स्टब्स को लागू करने के लिए अच्छा उपाय copyWithZone और mutableCopyWithZone प्रयास को पकड़ने के लिए सिफारिश की।

+1

यही वह है जो मैंने लागू करने के लिए किया था कुछ नेटवर्किंग क्लाइंट कोड का प्लगइन संस्करण जो मूल रूप से कोको ऐप में था। एक सहकर्मी इसे एक प्लगइन में चाहता था इसलिए मैं सिंगलटन मार्ग चला गया, इसलिए नेटवर्क क्लाइंट (आंतरिक रूप से) का केवल एक वास्तविक उदाहरण होगा। – ExitToShell

+0

@invariant, इस तरह का बहुत अच्छा जवाब है जो मुझे सवाल पूछने में प्रसन्न करता है और न केवल इसे गूंगा के रूप में खारिज कर देता है। –

+2

'+ alloc' को वापस लौटना चाहिए [[[self instance] retain] ', क्योंकि' alloc' एक स्वामित्व वाली वस्तु देता है। –

1

यह रिसाव जा रहा है। आप इसके साथ दूर होने अगर आप इसे करने के लिए बदल सकते हैं:

if(instance) { 
    [self release]; 
    return instance; 
} 

लेकिन यह अभी भी मेरे लिए एक सा बदबू आ रही है। मैं उत्सुक हूं कि आईबी में सिंगलेट्स के लिए आपके पास क्या उपयोग है; मुझे संदेह है कि मैं अपने कोड में इस निर्माण से बचूंगा।

+0

हाय सीमस, हाँ, कोड किसी भी तरह से काम नहीं करता है क्योंकि "इस कोडर को प्रतिस्थापित वस्तुओं को initWithCoder से वापस किया जाना चाहिए" ... वैसे भी, मैं आईबी में बाहरी ऑब्जेक्ट चेकआउट करने जा रहा हूं। मुद्दा यह है कि मैं ऐप के सभी टुकड़ों के लिए एक केंद्रीय सिंगलटन का उपयोग करता हूं ... इसलिए प्रत्येक टुकड़ा खुद को सिंगलटन के साथ पंजीकृत करता है। लेकिन फिर मैंने सोचा, उनमें से कुछ तार क्यों नहीं? –

+0

http://stackoverflow.com/questions/350861/what-bad-practice-do-you-do-and-why/350900#350900 –

+1

^^ प्यार स्वीकार करता है धागा :) –

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