Pourquoi s’auto-autorise dans un contexte statique dans l’objective c

Pourquoi l’utilisation de self est- self autorisée dans un contexte statique dans Objective-C?

Je pensais que c’était autorisé et 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 saisir le nom de la classe.

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

  1. Il n’y a pas de “contexte statique” dans Objective-C. Ce que nous avons à la place sont des “méthodes de classe”. Ce ne sont certainement pas des méthodes “statiques”.
  2. Les méthodes de classe (celles avec un préfixe + ) ne sont en fait que des méthodes d’instance sur un object de Class particulier. (Votre esprit a-t-il simplement explosé?) Et comme vous avez une variable self accessible dans une méthode d’instance, vous avez naturellement une variable self accessible dans la méthode de classe.
  3. Dans une méthode de classe, l’ self pointe vers la classe elle-même .
  4. Tout comme vous pouvez faire [self performAction] dans une méthode d’instance pour invoquer des méthodes sur cette instance particulière, vous pouvez faire [self performClassAction] dans une méthode de classe pour appeler des méthodes sur cette classe particulière.
  5. Tous Class objects de classe sont des sous-classes de NSObject . Vous pouvez donc utiliser n’importe quelle méthode d’instance NSObject sur n’importe quel object Class . (Votre esprit a-t-il juste explosé à nouveau?)

self n’est autorisé que dans le contexte d’une méthode Objective-C. Par «contexte statique», je suppose que vous voulez dire dans une méthode de classe (c’est-à-dire une signature qui commence par + plutôt que - ). Votre affirmation que « self n’est pas un alias pour appeler d’autres méthodes statiques» est incorrecte.

self est autorisé dans ces cas afin que vous puissiez:

  1. passer la classe en tant qu’object, puisque toutes les classes Objective-C sont elles-mêmes des objects
  2. envoyer des messages à une classe sans spécifier le nom de la classe, au cas où une méthode serait remplacée dans une sous-classe ( [Foo bar] utilisera toujours l’implémentation de Foo ; [self bar] utilisera n’importe quelle implémentation disponible en lui- self .)

Il est autorisé car self fait référence à l’object de classe lorsqu’il est utilisé dans les méthodes de classe. Est-ce ce que vous entendez par “contexte statique”? Si oui, quelles erreurs de mémoire avez-vous eues suggérées autrement?