2012-04-19 4 views
2

私のアプリケーションはCoreFoundationライブラリとインターフェイスしています。別のライブラリのいくつかの関数は、コア基底オブジェクトを返し、データを処理するためにオブジェクトの種類を特定する必要があります。 "タイプIDの値がリリースごとに変更される可能性があるため、コードでは、格納されたタイプIDまたはハードコードされたタイプIDに依存しないようにする必要はありません。また、型IDの観測されたプロパティ(例えば、小さな整数など)をコード化する。 "AppleがタイプIDをハードコードしないことを推奨している場合、Core Foundationオブジェクトを特定する方法は?

それに基づいて、私はenum(CFArray = 18, CFBoolean = 21など)を避けなければなりません。仕事と新しいリリースの変化の影響を受けなければなりません 唯一のものは、何かのように:その後、

int ID = CFGetTypeID(obj); if ID = CFBooleanGetTypeID() ...その後 if ID = CFStringGetTypeID() ...その後 if ID = CFDataGetTypeID() .. のように...

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

アップルは、CFCopyTypeIDDescriptionから返された情報の内容やフォーマットに依存関係を作成しないことをお勧めします。このため、このオプションも除外する必要があります。

戻ってきたコアファウンデーションタイプを簡単に特定できる理由と、Appleが常に新しいリリースで既存のコードを破棄しようとしている理由は誰でも知っていますか?残念ながら

+0

Appleは、リリースで既存のs/wを壊すことは望まない。 CFフレームワークが進化するにつれて、より標準化され、より中心的でより概念的になりつつあります。そのため、内部構造の変更が必要なのです。 –

答えて

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 
} 
+0

ええ、それは唯一の解決策のように見えますが、私は独立した初期化コードを追加するのが嫌いです。私はすべてのクラス(すべての基本的な基底オブジェクトを格納する)をすべての外部初期化コードから完全に独立させておくことを好みました。 このパターンを維持したい場合は、コレクションが初期化されていることを確認するために条件クラス "if"を基本クラス(CFTypeID)に追加することが最善の方法です( "If(TypesCollected)continue; else CollectNow ")。まだ好きではないものですが、他に選択肢はありません。 ありがとう – user1344320

1
初期化コードで

、あなたは静的な構造を設定することができ、多分辞書やstd :: map、関数ポインタまたはセレクタにCFTypeIDを関連付ける。そうすれば、あなたはCFBooleanGetTypeID()と友人を使用しますが、そのような各機能を1回だけ呼び出すことになります。

+0

ええ、それは唯一の解決策のように見えますが、私は独立した初期化コードを追加するのが嫌いです。私はすべてのクラス(すべての基本的な基底オブジェクトを格納する)をすべての外部初期化コードから完全に独立させておくことを好みました。 このパターンを維持したい場合は、コレクションが初期化されていることを確認するために条件クラス "if"を基本クラス(CFTypeID)に追加することが最善の方法です( "If(TypesCollected)continue; else CollectNow ")。まだ好きではないものですが、他に選択肢はありません。 ありがとう – user1344320

関連する問題