41 votes

Pourquoi le self est autorisé dans un contexte statique dans l'objectif c

Pourquoi l'utilisation self autorisé dans un contexte statique en Objective-C ?

Je pensais que c'était autorisé, puis j'ai rencontré des erreurs de mémoire qui m'ont pris une semaine pour découvrir que self n'est pas un alias pour appeler d'autres méthodes statiques de la classe au lieu de taper le nom de la classe.

Xcode et son compilateur semblent très intelligents pour trouver les pièges courants, pourquoi ne génère-t-il même pas un avertissement pour quelque chose comme ça ?

85voto

Dave DeLong Points 156978
  1. Il n'y a pas de "contexte statique" en Objective-C. Il n'y a pas de "contexte statique". Ce que nous avons à la place, ce sont des "méthodes de classe". Elles sont définitivement pas méthodes "statiques".
  2. Les méthodes de classe (celles qui sont préfixées par un + ) sont realmente juste des méthodes d'instance sur une Class objet. (est-ce que votre esprit vient d'exploser ?) Et puisque vous avez une self accessible dans une méthode d'instance, vous avez naturellement une variable self accessible dans la méthode de la classe également.
  3. Dans une méthode de classe, self Les points suivants la classe elle-même .
  4. Tout comme vous pouvez le faire [self performAction] à l'intérieur d'une méthode d'instance pour invoquer des méthodes sur cette instance particulière, vous pouvez faire ce qui suit [self performClassAction] à l'intérieur d'une méthode de classe pour invoquer des méthodes sur cette classe particulière.
  5. Tous Class sont des sous-classes de NSObject . Vous pouvez donc utiliser n'importe quel NSObject sur n'importe quelle méthode d'instance Class objet. (est-ce que votre esprit vient encore d'exploser ?)

8voto

Jonathan Grynspan Points 32291

self n'est autorisé que dans le cadre d'une méthode Objective-C. Par "contexte statique", je suppose que vous voulez dire à l'intérieur d'une méthode de classe (c'est-à-dire une méthode dont la signature débute par + plutôt que - .) Votre affirmation selon laquelle " self n'est pas un alias pour appeler d'autres méthodes statiques" est incorrect.

self est autorisé dans ces cas-là pour que vous puissiez :

  1. passer la classe comme un objet, puisque toutes les classes Objective-C sont elles-mêmes des objets.
  2. envoyer des messages à une classe sans spécifier le nom de la classe, dans le cas où une méthode est surchargée dans une sous-classe ( [Foo bar] utilisera Foo Toujours l'implémentation de l'UE ; [self bar] utilisera l'implémentation disponible dans self .)

5voto

Sherm Pendley Points 10822

C'est autorisé parce que self fait font référence à l'objet de la classe lorsqu'ils sont utilisés dans les méthodes de la classe. Est-ce ce que vous entendez par "contexte statique" ? Si oui, quelles erreurs de mémoire avez-vous rencontrées qui suggèrent le contraire ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X