2010-10-12 67 views
6

我試圖實現一個類,該子類直接從NSObject開始,只能有一個實例在整個應用程序中都可用。Objective-C創建只有一個實例的類的正確方法

目前我有這種做法:

// 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

你需要做的比這更多。這說明一個Objective-C單應如何實現:Objective-C Singleton

+0

謝謝,我會用這個解決方案! – 2010-10-12 01:18:54

+1

另請參閱http://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like – sdolan 2010-10-12 01:23:21

+0

不錯的鏈接,幫了我很多! – 2010-10-12 01:32:28

0

在您的情況,還有一種方法來創建類的第二個實例:

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

你需要的是覆蓋類的+(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'方法不在標題中,只在執行中... – 2010-10-12 01:17:14

+0

你會得到一個編譯器警告,但就是這樣。它仍然會運行,並創建第二個實例。此外,沒有任何東西禁止類的方法創建自己的另一個實例。 – executor21 2010-10-12 01:21:50

+0

實際上,你不會得到編譯器警告,因爲initInstance的定義在它的唯一用途之前。 – JeremyP 2010-10-12 09:45:04

相關問題