2010-10-12 2 views
6

J'essaie d'implémenter une classe qui sous-classe NSObject directement, qui ne peut avoir qu'une seule instance disponible pendant toute la durée d'exécution de l'application qui l'utilise.Objective-C Façon correcte de créer une classe avec une seule instance

Actuellement, j'ai cette approche:

// MyClass.h 

@interface MyClass : NSObject 

+(MyClass *) instance; 

@end 

Et la mise en œuvre:

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

Est-ce la bonne façon d'accomplir une telle tâche?

Merci

Répondre

7

Vous devez faire un peu plus que cela. Il décrit comment un singleton objectif-c doit être mis en œuvre: Objective-C Singleton

+0

Merci, je vais utiliser cette solution! –

+1

Voir aussi http://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like – sdolan

+0

Joli lien, m'a beaucoup aidé! –

0

Dans votre scénario, il y a encore un moyen de créer une deuxième instance de votre classe:

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

Qu'est-ce que vous voulez est de passer outre votre classe de +(id)alloc méthode:

+(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

Oui, mais la méthode 'initInstance' n'est pas dans l'en-tête, seulement dans l'implémentation ... –

+0

Vous obtiendrez un avertissement du compilateur, mais c'est tout. Il continuera à fonctionner et créera une seconde instance. De même, rien n'interdit à une méthode d'une classe de créer une autre instance de lui-même. – executor21

+0

En fait, vous n'obtiendrez pas d'avertissement de compilateur, car la définition de initInstance vient avant sa seule utilisation. – JeremyP

Questions connexes