Pourquoi la sous-classe NSObject?
Quel est le but/l'utilisation de NSObject en Objective-C? Je vois des classes qui étendent NSObject comme ceci:
@interface Fraction : NSObject
En C++ ou en Java, nous n'utilisons pas toutes les variables comme NSObject même si nous avons les directives de préprocesseur et les instructions d'importation dans les deux Objective-C et Java.
Pourquoi les classes explicitement hériter de NSObject en Objective-C? Quelles sont les conséquences de la non-déclaration de l'héritage de NSObject?
Vous devez vous connecter pour publier un commentaire.
Nous utilisons NSObject à indiquer qu'une classe hérite de. Je ne suis pas sûr que le C++, mais en Java, il y a quelque chose de similaire - la classe de l'Objet. La seule différence, c'est que Java n'exige pas que les classes explicitement descendre de l'Objet - la langue assume tout ce qui n'a pas un parent spécifié classe descend de l'Objet. Objective-C est différent car il permet de définir les différentes classes racines - vous sont autorisés de faire une classe qui n'hérite pas de NSObject.
Un exemple d'une telle racine différente de la classe est
NSProxy
.Ont un look à la GNUstep NSObject source, il montre comment les méthodes d'interagir avec l'objective-c d'exécution par le biais de fonctions C.
NSAllocateObject
etNSDeallocateObject
n'appartiennent pas à l'Objective-C runtime.Depuis les langages orientés objet, le concept d'un héritage, en héritage de la hiérarchie il y a une racine de la classe. En Java, la valeur par défaut de classe parent (si aucun n'est fourni) est
java.lang.L'objet
, alors qu'en Objective-C, si vous n'avez pas explicitement déclarer une classe parent, vous ne pas en obtenir un. Essentiellement, votre classe devient une racine de la classe elle-même. C'est une erreur commune parmi Objective-C les nouveaux arrivants, puisque vous souhaitez normalement hériter de NSObject dans de tels cas.Alors que souvent problématique et déroutante, cela permet en fait tout à fait un peu de souplesse, puisque vous pouvez définir vos propres hiérarchies de classe qui agissent d'une manière complètement différente de NSObject. (Java ne vous autorise pas à faire tout cela.) Sur l'autre main, sauf si vous savez ce que vous faites, il est facile d'avoir des ennuis de cette façon. Heureusement, le compilateur va fournir des avertissements si vous appelez une méthode qui n'est pas définie par une classe avec pas de déclaration de classe parent, tels que ceux que vous auriez normalement s'attendre à hériter de NSObject.
Comme pour "l'utilisation" de NSObject, consultez la documentation de l' La classe NSObject et NSObject protocole. Ils définissent les méthodes courantes utilisées pour l'allocation des objets, la gestion de la mémoire, la comparaison, le hachage, l'impression des descriptions, vérification de l'appartenance à une catégorie, l'interrogation de savoir si les objets de répondre à un sélecteur, etc. Fondamentalement, NSObject est "bon pour" fournir des fonctionnalités de base de l'Objective-C objets gratuitement.
Toutes les classes ne sont pas forcément d'hériter de NSObject mais c'est la base pour beaucoup de classes, car il offre des choses comme les alloc, les conserver, et de la libération.
NSObject est la classe racine de toutes les classes. À mon avis, c'est 3 fonctions de base sont à allouer et initialiser la mémoire pour vous (alloc & init), ainsi que de fournir une description de fonction.
Objective-C est sur tous les objets de l'envoi de messages à d'autres objets, afin de NSObject existe pour assurer que les fonctionnalités de base.
Si cela semble étrange pour vous, vous pouvez lire plus sur les paradigmes de programmation, en particulier la programmation orientée objet....En un mot, cependant, Objective-C est une simple extension au langage C. C vous procure la possibilité de programmer la mémoire de l'ordinateur, des chiffres, et des caractères, mais d'en faire autre chose (comme l'utilisation de chaînes, ou de montrer des points de vue, par exemple), vous avez besoin de l'extension de la partie, et NSObject est le début de l'extension.
Il peut être utile de choisir une classe (comme NSString, ou n'importe qui d'ailleurs), et suivre les super-classes de retour à NSObject, pour voir ce que la fonctionnalité de chaque classe ajoutée.
Espère que ça aide...
De la documentation d'Apple - https://developer.apple.com/documentation/objectivec/nsobject.
Fondamentalement, la plupart de la programmation orientée objet, les langages de programmation, explicitement ou implicitement, de spécifier la classe de base ou de la base de la fonctionnalité. Sinon, vous ne pouvez pas construire un système où les objets de communiquer les uns avec les autres. Propriétés, gestion de la mémoire, l'envoi d'un message mécanisme sont en partie ou entièrement à condition ou pris en charge par NSObject. Apple fournir des pièces de l'Objective-C mise en œuvre - https://opensource.apple.com/source/objc4/objc4-723/runtime/NSObject.mm.auto.html, où il est possible de voir ce qui est réellement à l'intérieur de NSObject.
Aussi parce que l'Objective-C est un langage de C-de la famille, de sorte que le compilateur et l'éditeur de liens doit calculer comment faire pour objet de mise en page dans la mémoire et où les mettre et de trouver des méthodes, qui n'est possible que si vous savez comment chacune des classes/instances fixe dans la mémoire et où. Dans le cas de l'Objectif-C toutes les classes de base (NSObject, NSProxy, etc) ont spécification de que, il est donc possible de calculer leur taille et ajouter sur le dessus tous hérité de trucs https://clang.llvm.org/compatibility.html#objective-c.
Par conséquent compilateur ne le laissez pas sortir de la classe sans classe de base. Donc en fin de compte l'héritage de classe devrait conduire à l'une des classes racines. Voici l'erreur qui s'affiche si vous ne spécifiez pas de lui (à partir de Xcode):