Are classes objects in Objective-C?

Here is a pretty good explanation of the matter by Greg Parker

Quoting:

[…] Each Objective-C class is also an
object. It has an isa pointer and
other data, and can respond to
selectors. When you call a “class
method” like [NSObject alloc], you are
actually sending a message to that
class object.

Since a class is an object, it must be
an instance of some other class: a
metaclass. The metaclass is the
description of the class object, just
like the class is the description of
ordinary instances. In particular, the
metaclass’s method list is the class
methods: the selectors that the class
object responds to. When you send a
message to a class – an instance of a
metaclass – objc_msgSend() looks
through the method list of the
metaclass (and its superclasses, if
any) to decide what method to call.
Class methods are described by the
metaclass on behalf of the class
object, just like instance methods are
described by the class on behalf of
the instance objects.

What about the metaclass? Is it
metaclasses all the way down? No. A
metaclass is an instance of the root
class’s metaclass; the root metaclass
is itself an instance of the root
metaclass. The isa chain ends in a
cycle here: instance to class to
metaclass to root metaclass to itself.
The behavior of metaclass isa pointers
rarely matters, since in the real
world nobody sends messages to
metaclass objects. […]

Further interesting reads:

Understanding the Objective-C Runtime by Colin Wheeler
(search for paragraph titled “So Classes define objects…”)

What is a meta-class in Objective-C? by Matt Gallagher

Leave a Comment