Краткий ответ: эта строка имеет тип NSCFString
, класс, который наследуется от NSMutableString
, следовательно, она отвечает на селекторы для методов, объявленных в NSMutableString
, включая суперклассы.
Не таккраткий ответ: базовые строки бесплатны и соединены с базовыми базовыми строками.Разработчики используют непрозрачные типы CFStringRef
(соединенные NSString
) и CFMutableStringRef
(соединенные NSMutableString
), чтобы ссылаться на эти строки, поэтому, на первый взгляд, есть два различных типа строк: неизменяемые и изменяемые.
С точки зрения внутренней реализации Core Foundation существует закрытый тип, называемый struct __CFString
.Этот закрытый тип содержит битовое поле, которое хранит, помимо прочего, информацию о том, является ли строка изменяемой или неизменной.Наличие единственного типа упрощает реализацию, поскольку многие функции совместно используются как неизменяемыми, так и изменяемыми строками.
Каждый раз, когда вызывается функция Core Foundation, которая работает с изменяемыми строками, она сначала читает это битовое поле и проверяет, является ли строка изменяемойили неизменный.Если аргумент должен быть изменяемой строкой, но на самом деле это не так, функция возвращает ошибку (например, _CFStringErrNotMutable
) или не подтверждает утверждение (например, __CFAssertIsStringAndMutable(cf)
).
В любом случае,это детали реализации, и они могут измениться в будущем.Тот факт, что NSString
не объявляет -appendString:
, не означает, что каждый экземпляр NSString
не отвечает на соответствующий селектор - подумайте заменяемость .Та же самая ситуация применяется к другим изменяемым / неизменным классам, таким как NSArray
и NSMutableArray
.С точки зрения разработчика, важно то, что возвращаемый объект имеет тип, который соответствует возвращаемому типу - это может быть сам тип или любой подтип этого типа.Кластеры классов делают это немного более запутанным, но ситуация не ограничивается кластерами классов как таковыми.
Таким образом, вы можете только ожидать, что метод возвращает объект, тип которого принадлежит иерархии (т. Е. Либовведите сам или подтип) типа для возвращаемого значения.К сожалению, это означает, что вы не можете проверить, является ли объект Foundation изменчивым или нет.Но опять же, вам действительно нужен этот чек?
Вы можете использовать функцию CFShowStr()
для получения информации из строки.В примере в вашем вопросе добавьте
CFShowStr((CFStringRef)myString);
. Вы должны получить вывод, подобный следующему:
Length 0
IsEightBit 1
HasLengthByte 0
HasNullByte 1
InlineContents 0
Allocator SystemDefault
Mutable 0
Contents 0x0
, где
Mutable 0
означает, что строка находится вфакт неизменен.