Quelqu'un peut-il m'expliquer pourquoi nous ne sommes pas la déséroférance d'un pointeur "maintenant" à une instance Nsdate, lorsque nous voulons réellement obtenir les données de cette instance, pas une adresse.
NSDate *now = [NSDate date]; NSLog(@"The new date lives at %p", now);
4 Réponses :
dans l'objectif-c, AFaik vous n'avez jamais la désarférence, le pointeur à un objet (comme vous pouviez le faire avec des pointeurs vers des structures). Il n'est pas différent des références Java, par exemple. P>
La question est la suivante: quelles données souhaitez-vous obtenir du nsdate code>? Vous devriez obtenir ces données via des méthodes. P>
Dans le deuxième bloc de code, j'obtiens l'adresse de Nsdate code> instance appelée
maintenant code>. Et dans le premier, j'ai la date réelle. Je ne peux tout simplement pas comprendre pourquoi nous obtenons la date seulement en modifiant le spécificateur de
% p code> à
% @ code>. (J'ai attendu au moins une erreur qu'il est impossible d'obtenir l'adresse dans le format de la chaîne)
Découvrez String Format Spécificateurs Plus important encore, la description de ce que % @ code> et
% p code> vous donne réellement
La variable appelée maintenant code> contient une référence à un lieu de mémoire. À la désarférence, un pointeur que vous devez faire comme vous le faites en C, en utilisant
* code>.
% @ code> est le spécificateur de format utilisé pour imprimer l'objet
Description code> (la chaîne renvoyée par son
Description code> Méthode). p>
Vous ne pouvez pas la désirer, car tous les types de l'objectif-C sont des interfaces. En termes de champs, vous ne savez pas ce qui est derrière le pointeur; En fait, votre objet Le pointeur est suffisant pour appeler des méthodes, mais si vous ne pouvez pas être certain que vous gérez vraiment un objet Le spécificateur de format Nsdate code> n'est probablement pas une instance de la classe code> nsdate code>. Il arrive simplement à mettre en œuvre toutes les méthodes
nsdate code> expose. P>
nsdate code>, vous feriez mieux d'essayer d'accéder directement à un champ directement. Par conséquent, si vous souhaitez obtenir des informations d'un objet, vous devez utiliser ses méthodes. P>
% @ code>, dans les fonctions de cacao et les méthodes, signifie que la méthode
- [NsObject Description] code> doit être appelée sur le pointeur pour connaître sa représentation textuelle. p>
La "date réelle" est un concept. Les "données" sont une série d'octets. Ils ne sont pas la même chose.
Si vous utilisiez de bonnes chaînes de style C à l'ancienne et imprimée, vous écrivez ceci: p> ceci est parce que le Donc, dans l'objectif-C, nous traitons des pointeurs vers des objets tout le temps, car les pointeurs sont le moyen le plus simple de les faire référence. Le système d'exécution, par exemple lorsqu'il traduit les sélecteurs de message dans les adresses de fonction pour les exécuter pour les exécuter. Votre code traite simplement le pointeur comme un pointeur et le transmet sans se soucier de la disposition précise des données à l'autre extrémité (les octets). P> P> Printf code> La fonction a besoin de l'adresse de la chose à utiliser avec elle. Vous n'en passez pas «les données réelles», mais l'adresse, car elle est bien plus efficace de transmettre l'adresse. Passer quelque chose à une fonction signifie copier sa valeur à la zone de la mémoire de la mémoire et de copier une adresse (32 ou 64 bits) que de copier une chaîne entière (plusieurs octets, ou peut-être que KB ou MB). P >
Merci beaucoup! J'ai finalement compris. Je ferais mieux d'accorder plus d'attention à cela.
Bienvenue dans le débordement de la pile! Je suis content que vous ayez trouvé cela utile. N'oubliez pas de voter les réponses utiles.
Merci pour l'accueil chaleureux! J'aimerais pouvoir voter, mais j'ai bien peur de devoir avoir au moins 15 reps