Короткий ответ: так и должно быть. Более длинный ответ: NSString
- это кластер классов.
Класс кластера
Кластер классов - это архитектура
который группирует ряд частных,
конкретные подклассы под публикой,
абстрактный суперкласс. Группировка
классы таким образом обеспечивает
упрощенный интерфейс для пользователя, который
видит только публично видимый
архитектура. За кулисами,
хотя абстрактный класс вызывает
до частного подкласса наиболее подходит
для выполнения определенного задания.
Многие распространенные классы Cocoa
реализованы в виде кластеров классов, включая NSArray
, NSString
и NSDictionary
.
Вы создаете и взаимодействуете с экземплярами кластера так же, как и с любым другим классом. За кулисами, однако, когда вы создаете экземпляр открытого класса, класс возвращает объект соответствующего подкласса на основе метода создания, который вы вызываете. (Вы не можете и не можете выбрать фактический класс экземпляра.)
NSString пример
NSString *a = @"UTF32.txt";
NSString *b = [NSHomeDirectory() stringByAppendingPathComponent:a];
NSTextStorage *storage = [[NSTextStorage alloc] initWithString:b];
NSString *c = [storage string];
Каждый из a, b и c может быть (а в 10.5 -) экземпляром другого частного подкласса (и фактически в Mac OS X v10.5 каждый -). Хотя каждый из объектов принадлежит к частному подклассу NSString
, удобно рассматривать каждый из объектов как экземпляры класса NSString
.
О Кластеры классов на сайте Apple для разработчиков: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW34