Quelques définitions
Un littéral est une valeur, qui est immuable, par définition. par exemple: 10
Une constante est en lecture seule variable ou un pointeur. par exemple: const int age = 10;
Une chaîne de caractères littérale est une expression comme @""
. Le compilateur va la remplacer par une instance de NSString
.
Une constante de chaîne est en lecture seule pointeur NSString
. par exemple: NSString *const name = @"John";
Quelques commentaires sur la dernière ligne:
- C'est un pointeur constant, pas une constante de l'objet1.
objc_sendMsg
2 ne se soucie pas si vous vous qualifiez l'objet avec l' const
. Si vous voulez un objet immuable, vous avez le code que l'immutabilité l'intérieur de l'objet3.
- Tous
@""
expressions sont en effet immuable. Ils sont remplacés4 au moment de la compilation avec les instances de l' NSConstantString
, ce qui est une institution spécialisée dans la sous-classe d' NSString
avec un fixe, disposition de la mémoire5. Cela explique aussi pourquoi, NSString
est le seul objet qui peut être initialisé au moment de la compilation6.
Une chaîne constante serait const NSString* name = @"John";
ce qui est équivalent à NSString const* name= @"John";
. Ici, à la fois la syntaxe et le programmeur intention sont mauvais: const <object>
"est ignoré et l' NSString
instance (NSConstantString
) était déjà immuable.
1 Le mot-clé const
s'applique s'applique à tout ce qui est immédiatement à sa gauche. Si rien n'est à sa gauche, il s'applique à tout ce qui est immédiatement à sa droite.
2 C'est la fonction que le moteur d'exécution utilise pour envoyer tous les messages en Objective-C, et donc ce que vous pouvez utiliser pour modifier l'état d'un objet.
3 Exemple: en const NSMutableArray *array = [NSMutableArray new]; [array removeAllObjects];
const n'empêche pas la dernière instruction.
4 Le code LLVM qui réécrit l'expression est - RewriteModernObjC::RewriteObjCStringLiteral
dans RewriteModernObjC.cpp.
5 voir l' NSConstantString
définition, cmd+clic dans Xcode.
6 la Création de compiler les constantes de temps pour les autres classes serait facile, mais il faudrait le compilateur à utiliser spécialisé de la sous-classe. Cela permettrait de casser la compatibilité avec les anciens Objective-C versions.
Retour à votre devis
Le Cacao cadres attendre que la chaîne globale des constantes plutôt que de
les littéraux de chaîne sont utilisés pour les clés de dictionnaire, de notification et de
exception noms, et certains paramètres de la méthode, qui prennent des chaînes de caractères. Vous
devrait toujours privilégier les constantes de chaîne sur les littéraux de chaîne lorsque vous
avoir un choix. En utilisant les constantes de chaîne, vous demandez de l'aide
compilateur pour vérifier votre orthographe et d'éviter ainsi des erreurs d'exécution.
Il est dit que les littéraux sont sujettes à erreur. Mais cela ne veut pas dire qu'ils sont aussi plus lents. Comparer:
// string literal
[dic objectForKey:@"a"];
// string constant
NSString *const a = @"a";
[dic objectForKey:a];
Dans le deuxième cas, je suis en utilisant les touches avec les pointeurs const, donc au lieu [a isEqualToString:b]
, je peux le faire (a==b)
. La mise en œuvre de l' isEqualToString:
compare la valeur de hachage, puis exécute la fonction C strcmp
, de sorte qu'il est plus lent que de comparer les pointeurs directement. Qui est pourquoi les chaines sont mieux: ils sont plus rapides pour comparer et moins sujette aux erreurs.
Si vous aussi vous voulez votre chaîne constante globale, de faire comme ceci:
// header
extern NSString *const name;
// implementation
NSString *const name = @"john";