Что означает термин «непрозрачный тип» в контексте «непрозрачного типа CFBundleRef»? - PullRequest
29 голосов
/ 09 апреля 2009

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

Ответы [ 3 ]

68 голосов
/ 09 апреля 2009

«Непрозрачный тип» - это тип, в котором у вас нет полного определения для 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", что означает указатель.

13 голосов
/ 09 апреля 2009

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

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

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

2 голосов
/ 09 апреля 2009

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

typedef struct CFBundle *CFBundleRef;

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

...