3

私のアプリケーションは、CoreFoundation ライブラリと連携しています。別のライブラリの一部の関数は、コア基盤オブジェクトを返します。データを処理するには、オブジェクトの種類を識別する必要があります。さて、CFType ライブラリ リファレンスを見ると、Apple は次のように明確に述べています。タイプ ID の観測されたプロパティ (たとえば、小さい整数であるなど)。」

それに基づいて、列挙型(CFArray = 18, CFBoolean = 21など)を避ける必要があります。機能し、新しいリリースの変更の影響を受けない唯一のことは、次のようなものです。

int ID = CFGetTypeID(obj); if ID = CFBooleanGetTypeID()そしたら… if ID = CFStringGetTypeID()そしたら… if ID = CFDataGetTypeID()そしたら…など…

これは本当に恐ろしいことです。オブジェクトを識別するためだけの多くの呼び出し。

Apple はまた、CFCopyTypeIDDescription から返される情報のコンテンツまたは形式に対する依存関係を作成しないことを推奨しているため、このオプションも除外する必要があります。

返されたコア基盤タイプを簡単に特定する方法と、Apple が常に新しいリリースで既存のコードを壊そうとする理由を知っている人はいますか?

4

2 に答える 2

2

残念ながら、将来の OS アップデートでアプリが壊れるリスクを冒したくない場合は、比較する必要があります。

if( CFGetTypeID(myUnknownCFObject) == CFArrayGetTypeID() ) {
  // handle the object as a CFArray
} else if( /* ... etc. ... */ ) {
} else {
  // we don't know how to deal with this object
}
于 2012-04-19T15:44:43.117 に答える
1

初期化コードでは、静的構造体(辞書やstd :: mapなど)を設定して、CFTypeIDsを関数ポインターまたはセレクターに関連付けることができます。そうすればCFBooleanGetTypeID()、友達と一緒に使用できますが、そのような各関数を1回だけ呼び出します。

于 2012-04-19T16:34:34.803 に答える