44 votes

Quelle est la différence entre déclarer une variable "id" et "NSObject *" ?

En Objective-C, quelle est la différence entre déclarer une variable id au lieu de le déclarer NSObject * ?

51voto

Chuck Points 138930

Avec une variable typée id vous pouvez lui envoyer n'importe quel message connu et le compilateur ne se plaindra pas. Avec une variable typée NSObject * vous ne pouvez lui envoyer que des messages déclarés par NSObject (pas les méthodes d'une sous-classe), sinon il générera un avertissement. En général, id est ce que vous voulez.

Explication complémentaire : Tous les objets sont essentiellement de type id . L'intérêt de déclarer un type statique est de dire au compilateur : "Supposez que cet objet soit un membre de cette classe." Ainsi, si vous lui envoyez un message que la classe ne déclare pas, le compilateur peut vous dire : "Attendez, cet objet n'est pas censé recevoir ce message !". De plus, si deux classes ont des méthodes avec le même nom mais des signatures différentes (c'est-à-dire des types d'arguments ou de retour), il peut deviner quelle méthode vous voulez dire par la classe que vous avez déclarée pour la variable. Si elle est déclarée comme id le compilateur lève les mains et vous dit : "OK, je n'ai pas assez d'informations ici. Je choisis une signature de méthode au hasard". (Cela ne sera généralement pas aidé par la déclaration de NSObject* cependant. En général, le conflit se situe entre deux classes plus spécifiques).

18voto

id signifie "un objet", NSObject * signifie "une instance de NSObject ou l'une de ses sous-classes". Il existe des objets en Objective-C qui ne sont pas NSObject (ceux que vous rencontrerez dans Cocoa pour le moment sont NSProxy , Protocol et Class ). Si un code attend un objet d'une classe particulière, le fait de le déclarer permet au compilateur de vérifier que vous l'utilisez correctement. Si vous pouvez vraiment prendre "n'importe quel objet" - par exemple vous déclarez un délégué et vous testerez tous les envois de méthodes avec respondsToSelector: vous pouvez utiliser un id .

Une autre façon de déclarer une variable objet est comme " id <NSObject> ", ce qui signifie "tout objet qui met en œuvre la méthode d'évaluation de la qualité de l'eau". NSObject protocole.

11voto

Julien Chastang Points 8357

D'après ma compréhension limitée de l'Objective-C, tous les objets ne sont pas dérivés de NSObject (contrairement à Java où tous les objets dérivent de Object). Vous pouvez théoriquement avoir d'autres objets Root. id pourrait s'appliquer à n'importe lequel de ces objets non dérivés de NSObject.

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