Question

Il y a quelques choses sur Objective-C qui sont source de confusion pour moi:

Tout d'abord, dans la section guide c objectif , il est très clair que chaque classe doit appeler la méthode d'initialisation de sa sous-classe. Il est un peu difficile de savoir si oui ou non une classe qui hérite directement de NSObject doit appeler sa méthode init. Est-ce le cas? Et si oui, pourquoi est-ce?

En second lieu, dans la section sur NSObject, il y a cet avertissement:

  

Une classe qui n'a pas besoin d'hériter un comportement particulier d'une autre classe devrait néanmoins être une sous-classe de la classe NSObject. Les instances de la classe doivent au moins avoir la possibilité de se comporter comme des objets Objective-C lors de l'exécution. Héritant cette capacité de la classe NSObject est beaucoup plus simple et beaucoup plus fiable que réinvente dans une nouvelle définition de la classe.

Est-ce que cela signifie que je dois préciser que tous les objets héritent de NSObject explicitement? Ou est-ce comme Java / Python / C # où toutes les classes sont des sous-types de NSObject? Sinon, est-il une raison de faire une classe racine autre que NSObject?

Était-ce utile?

La solution

1) Chaque fois qu'un objet est alloué en Objective-C sa mémoire est mis à zéro, et doit être initialisé par un appel à init. NSObject peuvent sous-classes de leurs propres routines de init spécialisées, et au début de ce qu'ils devraient appeler leur superclasse init quelque chose de routine comme ceci:

self = [super init];

L'idée étant que toutes les routines de init finiront par rejaillir jusqu'à la NSObject de init.

2) Vous devez être explicite sur l'héritage:

@instance myClass : NSObject { /*...*/ } @end

Il n'y a aucune raison d'avoir une classe racine autre que NSObject -. Beaucoup d'Objective-C repose en grande partie sur cette classe, afin d'essayer de contourner cela se traduira par vous vous tirer une balle dans le pied inutilement

Autres conseils

Comme il est possible d'hériter de différentes classes de base de la racine, oui, vous devez déclarer explicitement que vous héritez de NSObject lorsque vous effectuez une nouvelle classe (à moins bien sûr que vous le sous-classement quelque chose déjà, qui lui-même dans son tour sous-classe probablement NSObject).

Presque jamais est-il nécessaire de faire votre propre classe de base, il ne serait pas facile de le faire.

Objective-C peut avoir plusieurs classes de racines, de sorte que vous devez être explicite sur l'héritage. IIRC NSProxy est une autre classe racine . Vous voudrez probablement jamais ou besoin de créer votre propre classe racine, mais ils existent.

En ce qui concerne l'appel init NSObject, il fait partie sur mesure et à la sécurité de la pièce. init NSObject ne peut rien faire maintenant, ce ne garantit que le comportement futur ne changera pas. Appelez-init pour être en sécurité.

Vous devez appeler [super init] parce qu'il ya derrière le code d'initialisation que vous n'avez pas à écrire parce qu'il vous est écrit dans NSObjects init, telles que l'allocation de mémoire réelle probablement etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top