Введите кодировки
Для помощи системе во время выполнения компилятор кодирует возврат и типы аргумента для каждого метода в символьной строке и связывает строку с селектором метода. Схема кодирования, которую это использует, также полезна в других контекстах и так сделана общедоступной с @encode()
директива компилятора. Когда дали спецификация типа, @encode()
возвращает строку, кодирующую тот тип. Тип может быть основным типом такой как int
, указатель, маркированная структура или объединение или имя класса — любой тип, фактически, который может использоваться в качестве параметра C sizeof()
оператор.
char *buf1 = @encode(int **); |
char *buf2 = @encode(struct key); |
char *buf3 = @encode(Rectangle); |
Таблица ниже приводит коды типа. Обратите внимание на то, что многие из них накладываются с кодами, которые Вы используете при кодировании объекта в целях заархивировать или распределение. Однако существуют коды, перечисленные здесь, что Вы не можете использовать при записи кодера, и существуют коды, которые можно хотеть использовать при записи кодера, которые не сгенерированы @encode()
. (См. NSCoder
спецификация класса в ссылке Платформы Основы для получения дополнительной информации о кодировании объектов для архивации или распределения.)
Код | Значение |
---|---|
| A |
| |
| A |
| A
|
| A |
| |
| |
| |
| |
| |
| A |
| A |
| C++ |
| A |
| Символьная строка ( |
| Объект (или со статическим контролем типов или введенный |
| Объект класса ( |
| Селектор метода ( |
[тип массива] | Массив |
{name=type...} | Структура |
(name=type...) | Объединение |
| Немного поля цифровых битов |
| Указатель на тип |
| Неизвестный тип (среди прочего, этот код используется для указателей функции), |
Код типа для массива включается в квадратных скобках; число элементов в массиве сразу указано после открытой скобки перед типом массива. Например, массив 12 указателей на float
s был бы закодирован как:
[12^f] |
Структуры указаны в фигурных скобках и объединениях в круглых скобках. Тег структуры перечисляется сначала, сопровождается знаком «равно» и кодами для полей структуры, перечисленной в последовательности. Например, структура
typedef struct example { |
id anObject; |
char *aString; |
int anInt; |
} Example; |
был бы закодирован как это:
{example=@*i} |
То же кодирование заканчивается ли определенное имя типа (Example
) или тег структуры (example
) передается @encode()
. Кодирование для указателя структуры переносит ту же сумму информации о полях структуры:
^{example=@*i} |
Однако другой уровень абстракции удаляет внутреннюю спецификацию типа:
^^{example} |
Объекты обрабатываются как структуры. Например, передача NSObject
имя класса к @encode()
доходы это кодирование:
{NSObject=#} |
NSObject
класс объявляет всего одну переменную экземпляра, isa
, из Класса типа.
Обратите внимание на то, что несмотря на то, что @encode()
директива не возвращает их, система во время выполнения использует дополнительные кодировки, перечисленные в Таблице 6-2 для спецификаторов типа, когда они используются для объявления методов в протоколе.