Почему Apple ранее определила типы ссылок (указателей), а не сейчас? - PullRequest
7 голосов
/ 18 марта 2012

Мне было интересно, почему Apple использует типы данных в Core Foundation, которые являются typedef'd для указателя, в то время как в Какао они не являются.

В качестве примера вы могли бы сослаться на объект UIColor, такой как UIColor * а ссылка на объект CGColor будет CGColorRef?Или NSURL * и CFURLRef?Почему бы просто не всегда использовать CGColor * и CFURL *?Или, наоборот, почему нет типов UIColorRef или NSURLRef, поскольку вы все равно никогда не обращаетесь к UIColor или NSURL напрямую?

Или, например, почему это id, а не id *, поскольку он на самом деле является указателем и может фактически быть приведен к типу void *?

В частности, есть ли какая-то причина, по которой Apple имела привычку делать это в своих старых платформах, но перестала делать это в Какао?Это просто вопрос стиля?

Ответы [ 2 ]

8 голосов
/ 18 марта 2012

Что сказал Мэтт, но есть кое-что еще.

typedefs в API на основе C также позволяют скрывать детали реализации. Например, вы можете получить следующее, не определяя структуру __CFURL в общедоступном заголовке.

typedef __CFURL *CFURLRef;

Objective-C уже давно обладает такими функциями в виде категорий и, недавно добавленной, возможностью перемещать объявления переменных экземпляра из файла заголовка. Ожидайте, что со временем все переменные экземпляра будут удалены из общедоступных заголовочных файлов в SDK.

Обратите внимание, что каркасы Какао длинные, длинные, предварительно датированные CoreFoundation.

Что касается того, почему id используется вместо id *, это относится ко времени, когда Objective-C был впервые создан в начале 1980-х годов. В частности, понятие языка заключалось в том, что вы будете создавать «программные интегральные схемы», которые можно «соединить», как настоящие микросхемы. Цель состояла в том, чтобы сохранить биты Си как детали реализации и, в идеале, не раскрываться в ваших API.

Что касается того, почему вы в итоге получаете NSString * вместо NSString, то это в значительной степени именно из-за языка Си. Я написал довольно подробный ответ на немного другой вопрос, который так актуален.

Вы, вероятно, также найдете этот ответ соответствующим .

1 голос
/ 18 марта 2012

Причина NSURL* против CFURLRef в значительной степени в том, что это просто стиль кодирования. Какао - это Objective-C API, и общий стиль в Objective-C состоит в том, чтобы не иметь typedef, тогда как Core Foundation - это C API, а общий стиль - использовать typedef. Это в значительной степени связано со стилем кодирования.

id против id* - я не совсем уверен в этом, но я предполагаю, что это исторический вопрос, и они просто хотели, чтобы базовый «объект» был без *. Хотя я точно не знаю историю этого. Но опять же, это будет просто стиль.

...