ci-dessous est un échantillon de code de Didacticiel de données IOS Core d'Apple et je pensais que c'était bizarre que les déclarations conditionnelles vérifient si l'objet est nul. L'objet ne serait-il toujours pas toujours évalué à nil si la ligne avant que le conditionnel définit l'objet à NIL?
// A date formatter for the time stamp static NSDateFormatter *dateFormatter = nil; if (dateFormatter == nil) { dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; }
3 Réponses :
à cause du C'est une fonctionnalité de variables de durée de stockage statiques. Ils sont définis sur leur valeur initialisée au démarrage et conserver la valeur que vous les définissez après cela. Par exemple, le code suivant: p> ne produira pas une longue chaîne de zéros si vous l'appelez une période chancelle. Il produira: p> dans le cas du code Apple, cela signifie que le formateur de date sera créé à la demande et (sauf si vous le définissez retour em > à statique code>. Cette variable n'est pas définie sur
nil code> chaque fois que l'exécution passe dans cette instruction, elle ne définit que sur le démarrage du programme.
nil code> ailleurs seulement) une seule fois. Cela peut être important pour la performance si la création d'objet est une chose non triviale mais, même si non, il ne sert à rien de recréer en permanence quelque chose que vous pouvez simplement réutiliser. P> p>
Eh bien, il le ferait, parce que vous n'écrénez jamais xzzy code>. Peut-être
printf (#% d ", xyzzy ++); code>?
@Andrew, oui, j'ai réalisé qu'après avoir appuyé sur le bouton d'envoi, alors corrigé-le. Pas l'un des moments plus lumineux de mon temps ici :-)
Ah, ça a du sens! En fait, je me sens stupide, je n'ai pas remarqué le mot clé statique là-bas, mais c'est une bonne information néanmoins.
Tiny question à vous "experts statiques" :) - J'ai rencontré un bug étrange par rapport à une variable statique. Dans l'exemple de la question, disons que nous sautons le "= nil" lorsque nous déclarons la variable statique. Quelle valeur serait-elle réglée? Toute valeur aléatoire? (Dans ce cas, cela pourrait compromettre le fait que cela entre jamais dans la déclaration IF)
@ Dirty, la statique doit être définie sur un pointeur NULL que je pense est effectivement la même chose que nil code> (type différent mais de même valeur), au moins dans la mise en œuvre d'Apple.
Je suppose que ce code vient du corps d'une fonction. Vous devez noter que la variable est Le résultat de ce fait est initialisation paresseuse . Un nouveau statique code>. Cela signifie oui, la première fois que cette fonction est appelée, elle sera définie sur
nil code>. Cependant, la fonction Suivant em> la fonction est appelée, elle conserve sa valeur de l'appel précédent. P>
nsdateformatter code> est initialisé uniquement la première fois que cette fonction est appelée. P>
statique code> fait essentiellement une variable globale, initialisée à cette valeur, mais est visible uniquement à la fonction qu'elle est déclarée. P>
«Une variable globale, [...] visible uniquement à la fonction qu'elle est déclarée dans» C'est une contradiction. Je ne pense pas que tu veux dire "global".
Je veux dire globalement, dans le sens qui n'est pas attribué à la pile, comme avec la plupart des variables locales de fonction.
D'accord, ce n'est pas ce que signifie "global". Global fait référence à la visibilité. Vous parlez de lieu de stockage.
Je comprends cela, mais je pensais que cela avait plus de sens que de dire que c'était dans la section ".Data".
Le "statique" signifie que cela n'a évalué qu'une fois, lors de l'initialisation de cette classe et lors de la première exécution. Les courses ultérieures à travers vont sauter juste dessus et continuer à la ligne suivante. P>