En Objective-C, quelle est la différence entre déclarer une variable id
au lieu de le déclarer NSObject *
?
Réponses
Trop de publicités?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).
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.