2017-03-09 3 views
-1

J'ai une classe JSONModel dans mon application objective-c. J'utilise cette classe avec un singleton puis initialiser cette classe avec ce code:Comment vérifier si la classe JSONModel a été initialisée dans Objective-c?

MyClass *client = [[MyClass alloc] init]; 
client = [[MyClass alloc] initWithDictionary:myDictionary error:nil]; 

.h

@interface MyClass : JSONModel 
... 
+ (id)sharedInstance; 
... 
@end 

.m

static MyClass *singletonObject = nil; 

+ (id) sharedInstance 
{ 
    if (! singletonObject) { 

     singletonObject = [[MyClass alloc] init]; 
    } 
    return singletonObject; 
} 

- (id)init 
{ 
    if (! singletonObject) { 
     singletonObject = [super init]; 
    } 
    return singletonObject; 
} 

J'essaie vérifier si je devais mon initialize classe comme:

if([MyClass sharedInstance] == nil){ 

Mais je t ne fonctionne pas ... Comment puis-je vérifier si elle a été initialisée?

+1

Bien sûr que n » t work - 'sharedInstance' initialise l'objet s'il était' nil' avant de le retourner. Cela ressemble à un [problème X/Y] (https: //meta.stackoverflow.com/questions/254341/a-voiture-avec-roues carrées); Qu'essayez-vous de faire? – NobodyNada

+0

I Initialiser MyClass avec les données reçues du serveur lors d'un appel mais ensuite, je veux supprimer et rappeler ainsi je vérifie quand est vide pour faire l'appel et quand non ,, Espérons être clair – user3745888

+2

Je ne suis vraiment pas sûr de ce que vous fais ça ici. Pourquoi avez-vous même besoin d'un singleton? Aussi, que se passe-t-il dans votre méthode 'init'? Je pense que vous pourriez même violer les conventions de gestion de la mémoire, ce qui se traduira finalement par des bogues étranges. – NobodyNada

Répondre

0

Je pense que nous devons revenir à l'essentiel ici. Renvoyer un singleton à partir d'une méthode init n'est pas vraiment une bonne idée, c'est ce à quoi sert votre méthode de classe sharedInstance. En général, les méthodes doivent toujours faire exactement ce qu'elles disent et pas plus, par conséquent, une méthode init est là pour initialiser (init) une nouvelle instance et pas seulement retourner un singleton. De plus, la variable statique doit être déclarée dans la méthode de classe. C'est généralement la façon dont ces types de méthodes sont utilisées mais, comme d'autres l'ont dit, nous avons vraiment besoin de savoir quel type de comportement vous recherchez et pourquoi.

0

Si vous voulez créer un singleton, voici un exemple:

.h

@interface MyClass : JSONModel 
... 
@property(strong, nonatomic) Blah *blah; //NSMutableDictionary if you are trying to store JSON 

+ (id)sharedInstance; 
... 
@end 

.m

+ (id) sharedInstance { 
    @synchronized(self) { 
     if (! singletonObject) { 
      singletonObject = [[MyClass alloc] init]; 
     } 
     return singletonObject; 
    } 
} 

//getter 
- (Blah *)blah { 
    if (!blah) { 
     blah = [[Blah alloc] init]; 
    } 
    return blah; 
} 

Et vous voulez stocker votre JSON dans ce singleton ?? ?

MyClass *client = [MyClass sharedInstance]; 
client.blah = ...//your JSON dictionary or something else. This can be used as a global variable. 

Je ne sais pas ce que vous essayez de faire ici, je ne sais pas pourquoi l'événement que vous voulez un singleton, voulez-vous comme une variable globale stocker votre modèle JSON à utiliser dans l'application ?

+0

Je veux un singleton parce que je veux obtenir mon JSONModel d'une autre classe, avec le contenu initialisé par json, mais si mon contenu change, et je retourne à ma première classe où j'ai initialisé ma classe ce n'est pas recharger, parce qu'il a déjà ajouté le json .. – user3745888

1

Normalement, pour init un singleton, vous utilisez une méthode de classe (dans ce cas sharedInstance), et dans cette méthode de classe, init votre classe si elle est nulle. Puis appelez n'importe où d'autre comme ça pour y accéder.

MyClass *yourMom = [MyClass sharedInstance]; 

// you can use yourMom from now 

et il restera en mémoire tant que l'application n'est pas terminée.

0

Chaque fois que vous avez utilisé alloc/init, vous créiez simplement une autre instance au lieu d'utiliser le partage. Si vous voulez initialiser l'instance de la part d'une autre manière que juste init, essayer quelque chose comme ça:

MyClass *client = [MyClass reinitSharedInstanceWithDictionary: myDictionary]; 

.h

@interface MyClass : JSONModel 
... 
+ (id)sharedInstance; 
+ (id)reinitSharedInstanceWithDictionary:(NSDictionary*)dict; 
... 
@end 

.m

static MyClass *singletonObject = nil; 

+ (id) sharedInstance 
{ 
    if (! singletonObject) { 

     singletonObject = [[MyClass alloc] init]; 
    } 
    return singletonObject; 
} 

+ (id) reinitSharedInstanceWithDictionary:(NSDictionary*)dict 
{ 
    singletonObject = [[MyClass alloc] initWithDictionary:dict error:nil]; 
    return singletonObject; 
} 

- (id)init 
{ 
    if (! singletonObject) { 
     singletonObject = [super init]; 
    } 
    return singletonObject; 
}