Short anwer is that it is supposed to be like that. A longer answer is that NSString
is a class cluster.
Class cluster
A class cluster is an architecture
that groups a number of private,
concrete subclasses under a public,
abstract superclass. The grouping of
classes in this way provides a
simplified interface to the user, who
sees only the publicly visible
architecture. Behind the scenes,
though, the abstract class is calling
up the private subclass most suited
for performing a particular task.
Many common Cocoa
classes are implemented as class clusters, including NSArray
, NSString
, and NSDictionary
.
You create and interact with instances of the cluster just as you would any other class. Behind the scenes, though, when you create an instance of the public class, the class returns an object of the appropriate subclass based on the creation method that you invoke. (You don’t, and can’t, choose the actual class of the instance.)
NSString example
NSString *a = @"UTF32.txt";
NSString *b = [NSHomeDirectory() stringByAppendingPathComponent:a];
NSTextStorage *storage = [[NSTextStorage alloc] initWithString:b];
NSString *c = [storage string];
Each of a,b and c may be (and in 10.5 is) an instance of a different private subclass (and in fact, on Mac OS X v10.5, each is). Although each of the objects is of a private subclass of NSString
, it’s convenient to consider each of the objects to be instances of the NSString
class.
About Class Clusters in Apple Developer site: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW34