Comment puis-je utiliser un NSArray comme constante globale?
Je suis en utilisant un ensemble de Constant.m
fichiers, un par cible, pour définir des choses spécifiques pour chaque cible. Par exemple:
//Constants.h
extern NSString * const kDatabaseFileName;
//Constants.m
NSString * const kDatabaseFileName = @"target_one.sqlite";
Je tiens également à définir un NSArray pour chacun de mes objectifs:
NSArray * const kLabelNames = [[NSArray alloc] initWithObjects:
@"nameLabel", @"addressLabel", nil];
Mais cela donne "erreur: l'initialiseur de l'élément n'est pas constante". L'utilisation de 'arrayWithObjects" ne fonctionne pas non plus. Est-ce parce que les cordes dans mon tableau ne sont pas des constantes?
Comment puis-je configurer un tableau comme une constante globale? Merci.
source d'informationauteur nevan king
Vous devez vous connecter pour publier un commentaire.
Si vous voulez un jeu de constantes qui comprend NS types, envisager de placer le tout dans un singleton.
Vous pourriez avoir un seul fichier d'en-tête, et plusieurs fichiers de mise en œuvre (un par cible). Tant que tous en œuvre de la classe déclarée dans le fichier d'en-tête vous devriez être bien.
En Objective-C, les objets ne peuvent être alloués dans le tas, donc il n'y a aucun moyen de créer un NSArray dans la mémoire statique. Toutefois, vous pouvez créer un C tableau de pointeurs vers NSString constantes comme si...
...et puis vous pouvez écrire les méthodes de la classe comme celui-ci...
Modifier
Noter qu'avec l'introduction de nouvelles technologies, comme l'ARC, Grand Central Dispatch et la nouvelle syntaxe littérale pour les tableaux, il y a maintenant plus simple pour réaliser quelque chose de similaire. Notez que l'exemple ci-dessous fournit également une plus grande sécurité des threads, bien que le modèle original pourrait avoir intégré un
@synchronized
bloc, ou l'un des autres mécanismes, afin d'atteindre des résultats similaires.Cependant l'exemple ci-dessus n'est pas complètement répondre à la question d'origine. Si une constante globale tableau est vraiment nécessaire, l'exemple précédent peut être réécrit de la même manière que l'original de la réplique, tout en tirant parti de PGCD:
Voici une approche beaucoup plus simple:
Déclarer NSString avec des éléments séparés par des virgules (ou autre séparateur que vous voulez)
Puis de les convertir à NSArray chaque fois que vous en avez besoin:
Utiliser une macro:
Vous devez créer une classe qui contient les constantes dans les méthodes de la classe. Ensuite, vous pouvez ajouter la classe quelle que soit la cible et d'appeler les méthodes pour obtenir des constantes dans des objets comme des tableaux. Varier la classe ou de la catégorie de la mise en œuvre de modifier la déclaration des constantes.
Si vous l'utilisez beaucoup, vous pouvez créer un protocole qui définit les noms de méthode. Puis échange de la classe qui implémente le protocole de chaque cible, de sorte que le même code renvoie des valeurs différentes selon que de besoin.
Si vous voulez éviter de faire un NUL vérifier chaque utilisation, vous pouvez sous-classe NSObject +méthode initialize. Qui sera appelée une fois, la première fois que la classe est instanciée (et une fois de plus par la sous-classe, si toutes les sous-classes sont instanciés), et est un très bon endroit pour faire ce genre d'initialisation.
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html%23//apple_ref/occ/clm/NSObject/initialize