オブジェクトの検査
Core Foundation オブジェクトの主な特徴は、それらが不透明(または private) 型に基づいていることです。このためオブジェクトの内部データを直接検査することは困難である。ただし、基本サービスには、Core Foundation オブジェクトを検査できる 2 つの関数があります。これらの関数は、オブジェクトとオブジェクトの型の説明を返します。
Core Foundation オブジェクトの内容を調べるには、そのオブジェクトの CFCopyDescription 関数を呼び出し、参照された文字列オブジェクトに文字列 "contained" を出力します。
リスト 1 CFCopyDescription を使用して
void describe255(CFTypeRef tested) { char buffer[256]; CFIndex got; CFStringRef description = CFCopyDescription(tested); CFStringGetBytes(description, CFRangeMake(0, CFStringGetLength(description)), CFStringGetSystemEncoding(), '?', TRUE, buffer, 255, &got); buffer[got] = (char)0; fprintf(stdout, "%s", buffer); CFRelease(description); }
この例は、説明を印刷するための 1 つのアプローチを示しています。CFStringGetBytes 以外の CFString 関数を使用して、実際の文字列を取得できます。
"不明な" オブジェクトの型を判別するには、その型 ID を CFGetTypeID 関数で取得し、一致するものが見つかるまでその値を既知の型 ID と比較します。CFGetTypeID 関数を使用してオブジェクトの型 ID を取得します。また、各不透明型は、CFTypeGetTypeID (例えば、CFArrayGetTypeID など) の形式の関数も定義します。この関数はその型の型 ID を返します。したがって、CFType オブジェクトは以下のような特定の不透明型のメンバであるかどうかをテストできます。
CFTypeID type = CFGetTypeID(anObject); if (CFArrayGetTypeID() == type) printf(“anObject is an array.”); else printf(“anObject is NOT an array.”);
デバッガで Core Foundation オブジェクトの型に関する情報を表示するには、CFGetTypeID 関数を使用して型 ID を取得し、その値を CFCopyTypeIDDescription 関数に渡します。
/* aCFObject is any Core Foundation object */ CFStringRef descrip = CFCopyTypeIDDescription(CFGetTypeID(aCFObject));
前の章 次の章