9
votes

Dérofier à un pointeur dans l'objectif-c

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);


0 commentaires

4 Réponses :


3
votes

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.

La question est la suivante: quelles données souhaitez-vous obtenir du nsdate ? Vous devriez obtenir ces données via des méthodes.


2 commentaires

Dans le deuxième bloc de code, j'obtiens l'adresse de Nsdate instance appelée maintenant . 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 à % @ . (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 % @ et % p vous donne réellement



8
votes

La variable appelée maintenant 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 * .

% @ est le spécificateur de format utilisé pour imprimer l'objet Description (la chaîne renvoyée par son Description Méthode). xxx


0 commentaires

2
votes

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 Nsdate n'est probablement pas une instance de la classe nsdate . Il arrive simplement à mettre en œuvre toutes les méthodes nsdate expose.

Le pointeur est suffisant pour appeler des méthodes, mais si vous ne pouvez pas être certain que vous gérez vraiment un objet nsdate , 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.

Le spécificateur de format % @ , dans les fonctions de cacao et les méthodes, signifie que la méthode - [NsObject Description] doit être appelée sur le pointeur pour connaître sa représentation textuelle.


0 commentaires

9
votes

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: xxx

ceci est parce que le Printf 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).

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).


3 commentaires

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