「不透明なタイプ」とは何かについて、誰かがよく説明していますか? CFBundleRef
その用語は、「CFBundleRef 不透明型」と言っていた のコンテキストで見ました。それは読み取り専用のタイプですか?
3 に答える
struct
「不透明(OPAQUE)型」とは、またはの完全な定義がない型のことです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クラスを作成し、不透明(OPAQUE)型を介してCプログラマーが利用できるようNSString
にNSArray
します。NSBundle
Cプログラマーは、ポインターとヘルパー関数を使用して、これらのObjective-Cクラスのインスタンスを作成、操作、および破棄します。Appleはこれを「無料のブリッジング」と呼んでいます。これらは一般的な命名規則に従います。「CF」プレフィックス+クラス名+「Ref」サフィックス。ここで、「CF」は「Core Foundation」を表し、「Ref」は「Reference」の略で、ポインタを意味します。
不透明型は、下位レベルの型を「ラップ」する型であり、基礎となる実装が複雑な場合、またはユーザーが単に内部の仕組みを知る必要がない場合によく使用されます。Apple には、不透明な型に関する適切なページがあります。
たとえば、CFString は文字配列をラップし、その長さ、エンコーディングなどを維持するため不透明型ですが、ユーザーがこれらの値に直接アクセスすることは許可しません。むしろ、内部フィールドにアクセスまたは操作し、ユーザーに関連情報を返すメソッドを提供します。
それは将来宣言された構造です。例えば:
typedef struct CFBundle *CFBundleRef;
「struct CFBundle」の実際の定義がなければ、コードは CFBundleRef ポインター内の何にもアクセスできません。これは不透明です。