2010-08-13 8 views
0

Quel serait l'objectif équivalent c pour cela:Peut certains me aider à convertir le code C++ à l'objectif c

template<class T> 
class Singleton 
{ 
public: 
    static T * instance() 
    { 
     static T t; 
     return &t; 
    } 
private: 
    Singleton(); 
    ~Singleton(); 
}; 

Tout en appelant:

friend class Singletone<MyManagerClass>;

+0

double possible de [Qu'est-ce que votre Objective-C singleton ressembler?] (Http://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like) –

+0

Veuillez voir que ce code utilise le modèle iPhoneDev

Répondre

0
#define SINGLETON_FOR_CLASS(classname)       \ 
                   \ 
static classname *shared##classname = nil;      \ 
                   \ 
+ (classname *)instance {          \ 
    @synchronized(self) {          \ 
     if (shared##classname == nil) {       \ 
      [[self alloc] init];        \ 
     }              \ 
    }               \ 
                   \ 
    return shared##classname;         \ 
}                \ 
                   \ 
+ (id)allocWithZone:(NSZone *)zone {       \ 
                   \ 
    @synchronized(self) {          \ 
     if (shared##classname == nil) {       \ 
      shared##classname = [super allocWithZone:zone];  \ 
      return shared##classname;       \ 
     }              \ 
    }               \ 
                   \ 
    return nil;             \ 
}                \ 
                   \ 
- (id)copyWithZone:(NSZone *)zone {        \ 
                   \ 
    return self;            \ 
}                \ 
                   \ 
- (id)retain {             \ 
                   \ 
    return self;            \ 
}                \ 
                   \ 
- (NSUInteger)retainCount {          \ 
                   \ 
    return UINT_MAX;           \ 
}                \ 
                   \ 
- (void)release {            \ 
                   \ 
}                \ 
                   \ 
- (id)autorelease {            \ 
                   \ 
    return self;            \ 
}                \ 
2
+0

Le code C++ ci-dessus est générique pour créer un objet Singleton pour n'importe quelle classe. Ce qui n'est pas dans ton cas. Je cherche la classe Objective c qui peut renvoyer un objet singleton pour une classe donnée. merci – iPhoneDev

0

Oh c'est assez facile!

@interface YourClass : NSObject {} 
+ (YourClass *)singleton; 
@end 

static YourClass *singletonVar = nil; 
@implementation YourClass 
+ (YourClass *)singleton 
{ 
    if(! singletonVar) { 
    singletonVar = [[self alloc] init]; 
    } 
    return singletonVar; 
} 
@end 

Maintenant vous pouvez appeler [[VotreClasse]] quelque chose! : D Tout comme vous le faites [[NSUserDefaults standUserDefaults] valueForKey: @ "Burp"] et tels, notez que cette annonce annonce des frais généraux à votre application, donc lorsque vous utilisez le singleton plus d'une fois dans une portée, envisagez de le stocker dans un pointeur pour la performance.

+0

Le code C++ ci-dessus est générique pour créer un objet Singleton pour n'importe quelle classe. Ce qui n'est pas dans ton cas. Je cherche la classe Objective c qui peut renvoyer un objet singleton pour une classe donnée. merci – iPhoneDev

+0

Ce n'est pas sûr pour les threads mais ça marchera bien dans le cas contraire. – dreamlax

2

Objective-C ne fournit pas de modèles et les modèles ne fonctionnent pas avec les classes Objective-C lorsqu'ils sont compilés en Objective-C++. Il n'est pas toujours possible d'avoir une conversion 1-à-1 entre deux langages de programmation. Par exemple, Objective-C ne fournit pas du tout de méthodes privées forcées à la compilation, donc il n'y a aucun moyen de mettre en œuvre ce que vous voulez exactement exactement.

De la même manière, Objective-C dispose de fonctionnalités qui ne sont pas disponibles en C++, telles que la directive @encode().

Peut-être lié à ce sujet: il est important de comprendre que les modèles de conception qui fonctionnent bien avec C++ ne fonctionnent pas forcément bien — ou pas du tout — avec Objective-C.

Quel est le but de votre conception d'être capable de singletonise n'importe quelle classe? Peut-être existe-t-il un moyen Objective-C plus établi d'obtenir ce que vous voulez. Il peut également y avoir un moyen d'implémenter quelque chose de similaire en utilisant des macros de préprocesseur, mais vous ne voulez pas aller dans ce sens.

+0

Merci, alors que dois-je écrire dans l'objectif c pour y parvenir .. s'il vous plaît explorer un peu – iPhoneDev

+0

J'ai eu le moyen de créer un calss singleton générique dans l'objectif c, quelque chose comme ça ..#define SINGLETON_FOR_CLASS (classname) \t \t \t \t \t \t \t \ \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \ nom de classe statique * partagée ## classname = néant; – iPhoneDev

+0

@iPhoneDev: Quel est votre but ultime? Combien de singletons prévoyez-vous d'avoir? Ne peuvent-ils pas être simplement des propriétés de votre délégué d'application? – dreamlax