7
votes

nstrings statiques dans l'objectif-c

Je vois fréquemment un extrait de code comme celui-ci dans les méthodes d'instance de classe: xxx

Je n'arrive pas à comprendre pourquoi cela fonctionne. Est-ce simplement l'équivalent Objc d'un #define qui est limitée à la portée de la méthode? Je pense que je comprends la nature statique de la variable, mais plus spécifiquement des Nstrings, pourquoi ne pas être alloc'd, init'd?

merci ~


0 commentaires

5 Réponses :


2
votes

pour la partie de nsstring alloc, init :

Je pense d'abord, on peut penser comme une commodité, mais ce n'est pas aussi pareil pour [[Nstring Alloc] init] . .

J'ai trouvé un lien utile ici. Vous pouvez regarder ça Nstring et raccourcis

pour la partie de statique et #define :

L'instance statique dans la classe signifie que vous pouvez accéder à une instance de la classe. Vous pouvez modifier la valeur de statique. Pour la fonction, cela signifie que la valeur de la variable est conservée entre les appels de fonction

#define est mis une constante macro pour éviter le numéro de magie et la chaîne et définir des macros de fonction. #define max_number 100 . Ensuite, vous pouvez utiliser int a [max_mumber] . Lorsque le code est compilé, il sera copié et collé à int A [100]


6 commentaires

Ce n'était pas moi, mais je suis d'accord - votre réponse est simplement incompréhensible. Voir ma réponse, il enfreint la question de l'affiche originale en trois sujets différents (comment @ "text" littéraux sont traités, ce que le mot clé stats fait et comment cela diffère de un #define ) et donne des réponses claires que j'espère que les gens peuvent apprendre quelque chose à partir de.


Ah ok. Je n'avais pas la partie de statique. Parce que, à la première fois, je ne sais que sur Nstring Alloc, Initi Je ne réponds donc que pour cette partie. Je vais éditer ma réponse


statique , dans ce contexte, n'a rien à voir avec les cours.


Je ne comprends pas, une instance statique signifie la même chose pour les cas de classe, non?


Le mot clé statique peut signifier beaucoup de choses différentes selon le contexte. Dans ce contexte, nous parlons d'une variable déclarée statique dans une fonction, ce qui signifie simplement que sa valeur est préservée entre les appels à la fonction. Le fait que la fonction se trouve également être une méthode n'est pas pertinente.


OK j'ai compris. Merci, je vois le mot à l'intérieur de la méthode de la question



1
votes

C'est un cas d'init de cas spécial pour nstring qui pointe simplement le pointeur nstring sur une instance allouée et initée au démarrage (ou peut-être paresseusement, je ne suis pas sûr. ) Il y a l'un de ces instances Nstring créées dans cette mode pour chaque @ "" que vous utilisez dans votre programme.

Aussi, je pense que cela est vrai même si vous n'utilisez pas le mot clé statique. De plus, je pense que tous les autres nstrings initialisés avec cette chaîne pointeront sur la même instance (pas un problème car ils sont immuables.)

Ce n'est pas la même chose qu'un #define , car vous avez réellement une variable nstring en créant la chaîne avec le = @ "tout ce que" Initialisation. Il semble plus équivalent à C Const Char * Somestr = "bla bla bla" .


0 commentaires

9
votes

Je pense que la question a deux parties non liées.

one est pourquoi ne pas être alloc et injusté. La réponse est que lorsque vous écrivez un littéral de chaîne de l'objectif-C du formulaire "foo" , le compilateur de l'objectif-C créera une instance nstring pour vous.

L'autre question est ce que le modificateur statique . Il fait la même chose que cela fait dans une fonction C, garantissant que la variable mystring est la même chaque fois que la méthode est utilisée (même entre différentes instances d'objet).

A #define macro est quelque chose de très différent: c'est "Coupe programmatique et coller" du code source, exécuté avant que le code arrive au compilateur.


0 commentaires

2
votes

Vous ne voyez pas un appel à alloc / init car le @ "..." construction crée une constante chaîne en mémoire (via le compilateur).

Dans ce contexte, statique signifie que la variable n'est pas accessible du fichier dans lequel elle est définie.


0 commentaires

4
votes

vient de sculpter sur le même Statique Nstring Déclaration. Je me demandais comment exactement cette magie statique fonctionne, alors je lisais un peu. Je vais seulement aborder la partie statique de votre question.

Selon K & R Chaque variable en C a deux attributs de base: Type (par exemple, float) et classe de stockage (auto, registre, statique, externe, typé).

La classe de stockage statique a deux effets différents selon qu'il est utilisé:

  • à l'intérieur d'un bloc de code (par exemple à l'intérieur d'une fonction),
  • en dehors de tous les blocs (au même niveau qu'une fonction).

    une variable à l'intérieur d'un bloc qui n'a pas que la classe de stockage déclarée est par défaut considérée comme auto (c'est-à-dire qu'il est local). Il sera supprimé dès que le bloc sortira. Lorsque vous déclarez une variable automatique d'être statique, il conservera la valeur à la sortie. Cette valeur sera toujours là lorsque le bloc de code est invoqué à nouveau.

    Les variables globales (déclarées au même niveau qu'une fonction) sont toujours statiques. Déclicant explicitement une variable globale (ou une fonction) d'être statique limite son champ d'application au seul fichier de code source unique. Ce ne sera pas accessible et il ne sera pas en conflit avec d'autres fichiers source. Ceci s'appelle Linkage interne .

    Si vous souhaitez en savoir plus, suivez la lecture sur interne et externe Linkage en C .


0 commentaires