2010-05-11 3 views
2

Le compilateur réclame une erreur indiquant: "l'élément initializer n'est pas constant", lorsque j'essaie d'initialiser une variable statique dans une méthode avec un appel à une méthode statique (avec + dans sa définition). En tout cas je peux lui dire que cette méthode retourne toujours la même valeur. Je sais que ce n'est pas la même chose que la méthode statique, mais il semble qu'il n'y ait pas de méthodes constantes dans Objective-C (autres que les macros qui ne fonctionneront pas ici car j'appelle UI_USER_INTERFACE_IDIOM() depuis la méthode).Objectif C: initialisation d'une variable statique avec appel de méthode statique

Répondre

1

Vous ne pouvez pas faire cela en Objective-C.

Il y a deux solutions:

  1. Passer à Objective-C++. Modifier l'extension de fichier de .m à .mm.
  2. lsinitialisez avec nil, et vérifiez quand vous l'utilisez, comme dans:

    static NSString*foo=nil; 
    if(!foo){ 
         foo=[ ... ] ; 
    } 
    
+1

L'affectation nulle n'est pas strictement nécessaire, contrairement aux variables locales les variables statiques sont nulles par défaut. – hooleyhoop

4

Il y a en fait une autre solution, en plus de Yuji. Vous pouvez créer une fonction et la préfixer avec un attribut GCC (fonctionne également dans Clang et LLVM) qui l'entraînera avant d'être main(). Je l'ai utilisé cette approche à plusieurs reprises, et il ressemble à quelque chose comme ceci:

static NSString *foo; 

__attribute__((constructor)) initializeFoo() { 
    foo = ...; 
} 

Lorsque vous utilisez réellement foo, il sera déjà initialisé. Cela signifie que vous n'avez pas besoin de vérifier si c'est nil à chaque fois. (Il s'agit certainement d'un avantage minime en termes de performances, multiplié par le nombre de fois que vous l'utilisez, mais il peut également simplifier une ou plusieurs autres régions de code.Par exemple, si vous référencez la variable statique dans N différents endroits, vous pourriez avoir pour vérifier nil dans tous les N ou risquer un plantage Souvent, les gens appellent une fonction ou utilisent un #define pour gérer l'initialisation, et si ce code n'est utilisé qu'une seule fois, cela peut être une pénalité valant la peine d'être supprimée

Questions connexes