the main (practical / cosmetic) reason and something that you see in the MANY apple headings are other protocols.
Protocols
usually not inferred from NSObject .. this means that delegates and data sources that conform to a particular protocol no longer look NSObjects.
@protocol TableDelegate ... @end id<TableDelegate> delegate = bla;
==> The delegate does not respond to the basic NSObject methods. You will need to define it as NSObject ... but confusing the class and protocol in the definition is bad.
SO makes @protocol NSObject! And for this we need the NSObject protocol:
@protocol TableDelegate<NSObject> ... @end id<TableDelegate> delegate = bla;
===> delegate matches NSObject and everything feels more natural
it is also more akin to the idea of ββ"desiging to interface" imo
source share