Введите кодировки

Для помощи системе во время выполнения компилятор кодирует возврат и типы аргумента для каждого метода в символьной строке и связывает строку с селектором метода. Схема кодирования, которую это использует, также полезна в других контекстах и так сделана общедоступной с @encode() директива компилятора. Когда дали спецификация типа, @encode() возвращает строку, кодирующую тот тип. Тип может быть основным типом такой как int, указатель, маркированная структура или объединение или имя класса — любой тип, фактически, который может использоваться в качестве параметра C sizeof() оператор.

char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);

Таблица ниже приводит коды типа. Обратите внимание на то, что многие из них накладываются с кодами, которые Вы используете при кодировании объекта в целях заархивировать или распределение. Однако существуют коды, перечисленные здесь, что Вы не можете использовать при записи кодера, и существуют коды, которые можно хотеть использовать при записи кодера, которые не сгенерированы @encode(). (См. NSCoder спецификация класса в ссылке Платформы Основы для получения дополнительной информации о кодировании объектов для архивации или распределения.)

Табличный 6-1  Objective C вводит кодировки

Код

Значение

c

A char

i

int

s

A short

l

A long

l обрабатывается как 32-разрядное количество на 64-разрядных программах.

q

A long long

C

unsigned char

I

unsigned int

S

unsigned short

L

unsigned long

Q

unsigned long long

f

A float

d

A double

B

C++ bool или C99 _Bool

v

A void

*

Символьная строка (char *)

@

Объект (или со статическим контролем типов или введенный id)

#

Объект класса (Class)

:

Селектор метода (SEL)

[тип массива]

Массив

{name=type...}

Структура

(name=type...)

Объединение

bцифра

Немного поля цифровых битов

^ввести

Указатель на тип

?

Неизвестный тип (среди прочего, этот код используется для указателей функции),

Код типа для массива включается в квадратных скобках; число элементов в массиве сразу указано после открытой скобки перед типом массива. Например, массив 12 указателей на floats был бы закодирован как:

[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 для спецификаторов типа, когда они используются для объявления методов в протоколе.

Табличные 6-2  кодировки метода Objective C

Код

Значение

r

const

n

in

N

inout

o

out

O

bycopy

R

byref

V

oneway