In Objective-C, the namespaces for classes and protocols are separate. Foundation has both a class and a protocol called NSObject. In Pascal, all identifiers share the same namespace, so in case of clashes, we have to rename some. For the same reason, unlike in Pascal, in Objective-C you cannot declare an variable as just "protocol_name*", because otherwise it would be impossible for the compiler to decide whether you mean the protocol or the class. Instead, id<NSObject> is Objective-C for "any object that conforms to the NSObject protocol", while "NSObject*" is "any object that is related to the NSObject class".