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 runtime найдёт их во время выполнения).
В результате, когда файл компилируется с параметром -fconstant-string-class, все постоянные строковые объекты будут экземплярами класса, указанного в качестве аргумента этого параметра. Возможно одновременное использование нескольких модулей компиляции, ссылающихся на разные классы постоянных строк; ни компилятор, ни компоновщик не накладывают никаких ограничений на это.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Constant-string-objects.html