The id
type is not an actual type. In the context of an object
definition, id
is identical to the current class or instance
being defined, in contrast with a normal type that would indicate the
class containing the declaration; in the context of an invocation of a
method involving id
typed arguments or return values, id
denotes the actual receiver of the method.
For example, if a class Foo
declares the following method:
id self;
then the type of the expression
{ Foo a; [a self] }
is Foo
. If there exists a class Bar
which inherits from
Foo
, then the type of the expression
{ Bar a; [a self] }
will be Bar
, since it is a Bar
that was the actual
receiver of the self
message (as far as the compiler knows).
The meta level of id
can be shifted towards instances or classes,
as can be seen in the following two method declarations from the
State
class.
<doc> Return a newly allocated instance of the receiving class. </doc> instance (id) alloc; <doc> Return the class of the receiving object. </doc> class (id) class;
Thus, irrespective of the class of which the alloc
method is
invoked, the compiler knows that the object returned by alloc
is
an instance of the receiving class.
Similarly, the isa
instance variable is declared by the
State
instance as
class (id) isa;
Thus, in the context of a subclass of State
, the isa
has
the type of the actual class object, not just the State
class.
Go to the first, previous, next, last section, table of contents.