Что сказал Мэтт, но есть кое-что еще.
typedefs в API на основе C также позволяют скрывать детали реализации. Например, вы можете получить следующее, не определяя структуру __CFURL в общедоступном заголовке.
typedef __CFURL *CFURLRef;
Objective-C уже давно обладает такими функциями в виде категорий и, недавно добавленной, возможностью перемещать объявления переменных экземпляра из файла заголовка. Ожидайте, что со временем все переменные экземпляра будут удалены из общедоступных заголовочных файлов в SDK.
Обратите внимание, что каркасы Какао длинные, длинные, предварительно датированные CoreFoundation.
Что касается того, почему id
используется вместо id *
, это относится ко времени, когда Objective-C был впервые создан в начале 1980-х годов. В частности, понятие языка заключалось в том, что вы будете создавать «программные интегральные схемы», которые можно «соединить», как настоящие микросхемы. Цель состояла в том, чтобы сохранить биты Си как детали реализации и, в идеале, не раскрываться в ваших API.
Что касается того, почему вы в итоге получаете NSString *
вместо NSString
, то это в значительной степени именно из-за языка Си. Я написал довольно подробный ответ на немного другой вопрос, который так актуален.
Вы, вероятно, также найдете этот ответ соответствующим .