Подтвердить что ты не робот

Что означает термин "непрозрачный тип" в контексте "непрозрачного типа CFBundleRef"?

Есть ли у кого-то хорошее объяснение того, что такое "непрозрачный тип"? Я видел этот термин в контексте CFBundleRef, где они говорили: "CFBundleRef opaque type". Это тип, который только для чтения?

4b9b3361

Ответ 1

"непрозрачный тип" - это тип, в котором у вас нет полного определения для struct или class. В C, С++ и Objective-C вы можете сообщить компилятору, что тип будет определен позже с помощью объявления forward:

// 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" означает "Core Foundation", а "Ref" - ​​сокращение для "Reference", что означает его указатель.

Ответ 2

Непрозрачный тип - это тип, который "обертывает" типы нижнего уровня и часто используется, когда основная реализация сложна, или пользователю просто не нужно знать о внутренней работе. У Apple есть хорошая страница о непрозрачных типах здесь:

https://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/OpaqueTypes.html

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

Ответ 3

Это будущая структура. Например:

typedef struct CFBundle *CFBundleRef;

Без фактического определения "struct CFBundle" ваш код не сможет получить доступ к чему-либо в указателе CFBundleRef. Это непрозрачно.