В чем разница между структурой Swift и структурой Objective-C? - PullRequest
0 голосов
/ 18 марта 2019

В моем первом собеседовании меня спросили, в чем разница между структурой Swift и структурой Objective-C.

Кто-нибудь может объяснить эту разницу глубоко?Любая помощь будет оценена.

1 Ответ

5 голосов
/ 18 марта 2019

Структура Objective-C - это структура C, а структура C - это просто блок памяти со смещениями, определяемыми свойствами структуры. Итак, если структура имеет три int свойства, x, y, z, мы знаем, что x это просто псевдоним для «начала структуры», y это просто псевдоним для «такого количества байтов после начала структура ", а z это просто псевдоним для" некоторого другого числа байтов после начала структуры ". Структура C может храниться в стеке, если это локальная (автоматическая) переменная, или может храниться в куче, вызывая malloc и используя указатель структуры для ссылки на эту память. Структура C - это очень примитивный тип. И снова, ObjC-структуры - это просто C-структуры. Там нет разницы. (Фактически, именно поэтому вы не можете поместить объекты, управляемые ARC, в структуру ; они всего лишь структуры C, и ARC не может справиться с этим.)

Структуры Свифта - совершенно другое животное. Как правило, они по-прежнему реализуются в виде блока памяти, либо в стеке, либо в куче, свойства которой смещаются в блок памяти, но это в основном просто детали реализации. Структуры Swift - это расширенные типы, которые могут иметь методы, расширения, соответствовать протоколам и большинству других вещей, которые можно ожидать от расширенного типа в языке с расширенным набором типов.

Самое главное, структуры Swift - это не просто «каламбуры памяти», подобные структурам C. Вы можете указывать разные структуры C на одну и ту же память и читать ее по-разному (конечно, профсоюзы могут делать это, но вы также можете просто делать это непосредственно со структурами). Нет правила, что базовый блок памяти будет того же размера, что и структура в C (так работает, например, objc_object). Но структуры Swift не допускают такого наложения памяти. Они «владеют» своей памятью гораздо более напрямую. Если вы хотите возиться со своей внутренней памятью, вам придется пройти через какой-то «небезопасный» интерфейс. Вы не можете просто добавить 4 к указателю и получить любое значение, например, структуру C.

Из-за всего этого вы можете хранить управляемые ARC объекты в структуре Swift (и на самом деле это все время выполняется в stdlib.)

Так что да, совершенно разные твари, несмотря на то, что у них одно и то же имя. Единственное, что действительно одинаково, - это то, что оба они имеют типы значений со свойствами.

...