2010-10-12 10 views
6

मैं कक्षा को कार्यान्वित करने की कोशिश कर रहा हूं, जो कि NSObject उप-वर्गों को सीधे चलाता है, जो पूरे समय पूरे एप्लिकेशन में उपयोग कर रहा है, इसका उपयोग कर रहा है।उद्देश्य-सी केवल एक उदाहरण के साथ कक्षा बनाने के लिए उचित तरीका

// MyClass.h 

@interface MyClass : NSObject 

+(MyClass *) instance; 

@end 

और कार्यान्वयन:

// MyClass.m 

// static instance of MyClass 
static MyClass *s_instance; 

@implementation MyClass 

-(id) init 
{ 
    [self dealloc]; 
    [NSException raise:@"No instances allowed of type MyClass" format:@"Cannot create instance of MyClass. Use the static instance method instead."]; 

    return nil; 
} 

-(id) initInstance 
{ 
    return [super init]; 
} 

+(MyClass *) instance { 
    if (s_instance == nil) 
    { 
     s_instance = [[DefaultLiteralComparator alloc] initInstance]; 
    } 

    return s_instance;  
} 

@end 

इस उचित तरीके से इस तरह के एक कार्य को पूरा करने है

वर्तमान में मैं इस दृष्टिकोण है?

धन्यवाद

उत्तर

7

आपको उससे थोड़ा अधिक करने की आवश्यकता है। यह बताता है कि कैसे एक उद्देश्य-सी सिंगलटन लागू किया जाना चाहिए:

MyClass *secondInstance = [[MyClass alloc] initInstance]; //we have another instance! 

क्या आप चाहते हैं कि आपकी कक्षा के ओवरराइड करने के लिए है: Objective-C Singleton

+0

धन्यवाद, मैं इस समाधान का उपयोग करूंगा! –

+1

यह भी देखें http://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like – sdolan

+0

अच्छा लिंक, मुझे बहुत मदद मिली! –

0

अपने परिदृश्य में, वहाँ अभी भी अपनी कक्षा का एक दूसरा उदाहरण बनाने के लिए एक रास्ता है +(id)alloc विधि:

+(id)alloc{ 
    @synchronized(self){ 
     NSAssert(s_instance == nil, @"Attempted to allocate a second instance of singleton(MyClass)"); 
     s_instance = [super alloc]; 
     return s_instance; 
    } 
    return nil; 
} 
+0

हां, लेकिन 'initInstance' विधि हेडर में नहीं है, केवल कार्यान्वयन में ... –

+0

आपको एक कंपाइलर चेतावनी मिलेगी, लेकिन यह है। यह अभी भी चलाएगा, और दूसरा उदाहरण बनायेगा। इसके अलावा, कुछ भी एक वर्ग की विधि को स्वयं का एक और उदाहरण बनाने से रोकता है। – executor21

+0

दरअसल, आपको एक कंपाइलर चेतावनी नहीं मिलेगी, क्योंकि initInstance की परिभाषा इसके उपयोग से पहले आता है। – JeremyP

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