J'ai remarqué à partir du code source LLVM que le compilateur prend en charge le drapeau:Objective C chaîne constante conversion implicite?
-fconstant-string-class=CLASSNAME
Si ce drapeau est pas présent, le compilateur semble par défaut NSConstantString.
Lors de l'inspection de la bibliothèque Foundation d'Apple, NSConstantString hérite de NSSimpleCString qui fournit les ivars requis pour activer le comportement de chaîne constante ObjC. Ceci est à son tour une classe enfant de NSString.
Cependant, en code normal ObjC, ce qui suit est parfaitement légal:
NSString *anNSString = @"This is an NSConstantString?";
Cela semble bien (NSConstantString est la classe enfant), à l'exception:
1) Les données d'une constante chaîne devrait être canalisé dans les ivars déclarés dans NSSimpleCString, qui ne sont pas disponibles pour un NSString.
2) Les méthodes d'itération de NSString suggèrent qu'il est construit sur des tableaux d'unichars. Cela signifie qu'il doit y avoir une conversion des caractères de NSConstantString vers les unichars de NSString.
Comme la surcharge de l'opérateur n'est pas possible dans Objective C, comment/où cette conversion a-t-elle eu lieu? Y a-t-il des trucs de génération de codes qui se passent ici? Ou ai-je manqué quelque chose de plus évident?
Bonne réponse. Pour clarifier un peu: 'NSString' ne se soucie pas de ses ivars, même en interne ... toute sa fonctionnalité passe par les méthodes primitives' longueur' et 'characterAtIndex:'. Tant que son propre code et toutes les autres classes qui l'utilisent respectent ce contrat, 'NSConstantString' peut implémenter ces méthodes comme bon lui semble et toujours interopérer. – rickster
vous pouvez ressentir un certain inconfort et/ou désorientation au début, mais cela va passer dans le temps. :) – nielsbot
Merci beaucoup :). En ce qui concerne votre édition - comment avez-vous pu constater que NSString ne déclare pas d'ivars supplémentaires? Pour être en mesure d'obtenir ce type d'informations internes pour d'autres classes serait plutôt utile ..! – Ephemera