Una definició de classe és una especificació per a un tipus d'objecte. La classe, en efecte, defineix un tipus de dada. El tipus es bassa no tant en l'estructura de dades que la classe defineix (variables d'instància), sinó més aviat amb el comportament inclòs en la definició (mètodes).
Un nom de classe pot apareixer en el codi font on sigui que un especificador de tipus siguin permes en C -- per exemple, com un argument de l'operador sizeof:
int i = sizeof(Rectangle);
Pots utilitzar un nom de classe en lloc d'id per designar un tipus d'objecte:
Rectangle *elMeuRect;
Com que aquesta forma de declarar un tipus d'objecte dona informació al compilador sobre el tipus d'objecte que és, és connegut com a definició de tipus estàtica. Així com id es defineix com un punter a un objecte, els objectes són definits estàticament com a punters a una classe. Els objectes sempre són definits per un punter. La definició estàtica utilitza el punter explícit; id l'amaga.
La definició estàtica permet al compilador fer una comprovació de tiups -- per exemple, advertir si un objecte pot rebre un missatge que apareix que no és possible respondre -- i per deslligar algunes restriccions que normalment s'apliquen als objectes definits id. A més, pot aclarir les teves intencions a altres que llegeixen el teu codi. Tanmateix, no defugen l'enllaçat dinàmic o l'alteració de la determinació dinàmica de la classe del receptor en l'hora de l'execució.
Un objecte pot estar declarat estàticament per la seva pròpia classe o per qualsevol classe de la que hereda. Per exemple, com que la herència fa que un Rectangle sigui un tipus de Graphic, una instància de Rectangle pot declarar-se estàticament com una clase Graphic:
Graphic *elMeuRect;
Això és possible perqué un Rectangle és un Graphic. Això és més que un Graphic ja que també té variables d'instància i mètodes amb capacitats d'una Forma (Shape) i un Rectangle, però tanmateix és un Graphic. Pel propòsit de la comprovació de tipus, el compilador considera elMeuRect com un Graphic, però a l'hora d'executar-se es tractat com un Rectangle.
Mireu "Permetent Comportaments Estàtics" en el pròxim capítol per saber-ne més sobre la definició estàtica i els seus beneficis.
Les instàncies poden revelar els seus tipus a l'hora d'executar-se. El mètode isMemberOfClass:, definit en la classe NSObject, comproba si un receptor és una instància d'una classe en particular:
if ( [unObjecte isMemberOfClass:algunaClasse] )
...
El mètode isKindOfClass:, també definida en la classe NSObject, comprova més generalment si el receptor hereda d'una classe o si es un membre d'una en particular (si té la classe en la seu camí d'herència):
if ( [unObjecte isKindOfClass:algunaClasse] )
...
El conjunt de classe per les qual isKindOfClasse: retorn SI és el mateix conjutn que el receptor pot ser definit estàticament.
La introspecció no es limita al tipus d'informació. En seccions posteriors d'aquest capítol es parla dels mètodes que retornen l'objecte de classe, informen si un objecte poden respondre a un missatge, i revelen altra informació.
Mireu l'especificació de la classe NSObject en la referència del marc de treball Foundation per saber-ne més sobre isKindOfClass:, isMemberOfClasse:, i mètodes relacionats.