2009-07-16 5 views
0

J'ai une méthode où je fais quelques animations de démarrage. La méthode est appelée plusieurs fois pendant l'utilisation de l'application, mais lors de son premier appel, elle doit également faire des choses spéciales.Quel est le moyen le plus simple de déterminer si une méthode a été appelée pour la première fois depuis le début de l'application?

Est-ce que Singletons est la solution? Peut-être y a-t-il aussi un meilleur moyen, au lieu de mesurer combien de fois cette méthode a été appelée, et de stocker cela dans un ivar.

Répondre

7
- (void)someMethod { 
    static BOOL hasBeenCalledBefore = NO; 
    if (!hasBeenCalledBefore) { 
     // perform setup 
     hasBeenCalledBefore = YES; 
    } 
    // do other stuff 
} 

Des travaux supplémentaires peuvent être requis si vous utilisez des threads, mais c'est l'idée de base.

+0

Ceci ne gère pas les situations où la classe est chargée par plusieurs chargeurs de classe multiples (mais différents). Le singleton va seulement tenir pour un seul chargeur de classe. Si votre code peut s'exécuter dans un conteneur, il se peut qu'il s'exécute dans plusieurs JVM et que chacun pense que c'est le seul. Cela dépend vraiment de ce que vous essayez de compter/protéger. Java n'est pas le choix le plus propre lorsqu'il s'agit de verrouiller des ressources en raison du problème de classloader/JVM. –

+0

@Kelly: Ce n'est pas Java. C'est Objective-C. Je ne pense pas que l'iPhone puisse même exécuter Java. – Chuck

2

Pourquoi ce code d'initialisation n'est-il pas dans le constructeur? Peut-être que vous avez besoin de factoriser cette méthode dans sa propre classe qui utilise le constructeur pour gérer le bloc init que vous mentionnez.

2

Un amendement à la réponse de mandrin (à peu près correct)

Ses œuvres et répond à votre question, mais une autre option, vous pouvez utiliser (en supposant qu'il n'a pas besoin d'avoir accès à l'une des variables étant passé à cette méthode) serait de sortir le code de votre méthode et le mettre dans un initialiseur statique. Il ne sera exécuté que lorsque la classe est chargée pour la première fois et isolera ce qui est essentiellement des morceaux de code complètement différents.

Si vous souhaitez l'appeler pour chaque nouvelle classe, utilisez la réponse de Chuck mais avec une variable membre ou utilisez un initialiseur de classe.

Questions connexes