1.
It is a class (interface) because all concrete classes in ObjC nowadays inherit implementations from NSObject, to support features such as reference-counting and run-time type checking.
2.
Now for the protocol... it exists because NSObject is not the only root class that supports the -retain
and -performSelector:
etc methods.
One important class is NSProxy, which acts as a proxy to forward messages to some actual objects.
The targets of NSProxy are usually NSObjects, so the interface should also support -retain
and -performSelector:
etc methods. But NSProxy cannot inherit from NSObject because there is no is-a relationship between the two.
To express the sibling relationship, both are made to adopt the same protocol, which, unfortunately, also called NSObject.
Making NSObject a protocol also has an advantage that, user-defined protocols can request adopters to support all usual NSObject operations by
@protocol Foo <NSObject>
...
3.
It's a category, which adds extra method implementations to NSObject.