«Непрозрачный тип» - это тип, в котором у вас нет полного определения для struct
или class
. В C, C ++ и Objective-C вы можете сказать компилятору, что тип будет определен позже, используя предварительное объявление:
// forward declaration of struct in C, C++ and Objective-C
struct Foo;
// forward declaration of class in C++:
class Bar;
// forward declaration of class in Objective-C:
@class Baz;
Компилятору не хватает информации, чтобы позволить вам делать что-либо напрямую с struct
или class
, кроме объявления указателей на него, но это часто все, что вам нужно сделать. Это позволяет создателям библиотек и фреймворков скрывать детали реализации. Пользователи библиотеки или фреймворка затем вызывают вспомогательные функции для создания, манипулирования и уничтожения экземпляров форварда, объявленного struct
или class
. Например, создатель фреймворка может создать эти функции для struct Foo
:
struct Foo *createFoo(void);
void addNumberToFoo(struct Foo *foo, int number);
void destroyFoo(struct Foo *foo);
Как часть инфраструктуры Core Foundation, Apple делает общие классы Objective-C, такие как NSString
, NSArray
и NSBundle
, доступными для программистов на C через непрозрачные типы. Программисты C используют указатели и вспомогательные функции для создания, манипулирования и уничтожения экземпляров этих классов Objective-C. Apple называет это «бесплатной связью». Они следуют общему соглашению об именах: префикс "CF" + имя класса + суффикс "Ref" , где "CF" обозначает "Базовое основание", а "Ref" - сокращение от "Reference", что означает указатель.