8.5 Объекты константных строк ¶
GNU Objective-C предоставляет объекты константных строк, которые генерируются непосредственно компилятором. Вы объявляете объект константной строки, предваряя строку C-стиля символом ‘@’:
id myString = @"this is a constant string object";
Объекты константных строк по умолчанию являются экземплярами класса NXConstantString, предоставляемого реализацией GNU Objective-C. Для получения определения этого класса необходимо включить заголовочный файл objc/NXConstStr.h.
Пользовательские библиотеки могут захотеть реализовать свой собственный класс константных строк. Для поддержки этого компилятор GNU Objective-C предоставляет новую командную опцию -fconstant-string-class=имя_класса. Предоставляемый класс должен соответствовать строгой структуре, такой же, как структура NXConstantString:
@interface MyConstantStringClass
{
Class isa;
char *c_string;
unsigned int len;
}
@end
NXConstantString наследуется от Object; пользовательские библиотеки могут выбрать наследование кастомизированного класса константных строк от другого класса, отличного от Object. Нет требований к методам, которые должен реализовывать класс константных строк, но конечная структура ivar класса должна быть совместима с указанной структурой.
Когда компилятор создает статически выделенный объект константной строки, поле c_string будет заполнено компилятором строкой; поле length будет заполнено компилятором длиной строки; указатель isa будет заполнен компилятором NULL, а затем автоматически исправлен во время выполнения библиотекой времени выполнения GNU Objective-C, чтобы указывать на класс, установленный опцией -fconstant-string-class при загрузке объектного файла (если вас интересует, как это работает за кулисами, имя используемого класса и список статических объектов для исправления хранятся компилятором в объектном файле в месте, где библиотека времени выполнения GNU найдёт их во время выполнения).
В результате, когда файл компилируется с опцией -fconstant-string-class, все объекты константных строк будут экземплярами класса, указанного в качестве аргумента этой опции. Возможна ситуация, когда несколько единиц компиляции ссылаются на разные классы константных строк, компилятор и компоновщик не накладывают никаких ограничений на эту ситуацию.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/Constant-string-objects.html