Objective-Cには名前空間がありません。Cによく似ており、すべてが1つのグローバル名前空間内にあります。一般的な方法は、クラスの頭にイニシャルを付けることです。たとえば、IBMで作業している場合は、クラスの前に「IBM」を付けることができます。Microsoftで働いている場合は、「MS」を使用できます。等々。時々、イニシャルはプロジェクトを参照します。例えばAdiumはクラスの前に "AI"を付けます(イニシャルを取ることのできる背後に会社はないので)。Appleはクラスの前にNSを付け、このプレフィックスはApple専用に予約されていると述べています。
これまでのところ。ただし、クラス名の前に2〜4文字を追加することは、非常に限定された名前空間です。たとえば、MSやAIはまったく異なる意味を持つ可能性があり(たとえばAIは人工知能である可能性があります)、他の開発者がそれらを使用して同じ名前のクラスを作成する場合があります。バング、名前空間の衝突。
これが独自のクラスと使用している外部フレームワークのいずれかとの衝突である場合は、クラスの名前を簡単に変更できます。しかし、2つの外部フレームワークを使用すると、どちらのフレームワークにもソースがなく、変更できないのでしょうか。アプリケーションはそれらの両方とリンクし、名前の競合が発生します。これらをどのように解決しますか?両方のクラスを引き続き使用できるようにそれらを回避する最良の方法は何ですか?
Cでは、ライブラリに直接リンクしないことでこれらを回避できます。代わりに、実行時にdlopen()を使用してライブラリをロードし、dlsym()を使用して探しているシンボルを見つけ、それをグローバルシンボルに割り当てます(任意の方法で名前を付けることができます)、このグローバルシンボルを介してアクセスできます。たとえば、一部のCライブラリにopen()という名前の関数があるために競合が発生した場合、myOpenという名前の変数を定義して、ライブラリのopen()関数を指すようにして、システムのopen()を使用したい場合に、あなたは単にopen()を使用し、もう1つを使用したい場合は、myOpen識別子を介してそれにアクセスします。
Objective-Cでも同様のことが可能ですか?そうでない場合、名前空間の競合を解決するために使用できる他の巧妙でトリッキーなソリューションはありますか?何か案は?
更新:
これを明確にするために:名前空間の衝突を事前に回避する方法またはより適切な名前空間を作成する方法を提案する回答は確かに歓迎されます。しかし、私の問題を解決しないので、それらを答えとして受け入れません。2つのライブラリがあり、それらのクラス名が衝突しています。それらを変更することはできません。どちらのソースもありません。衝突はすでに存在しており、それを事前に回避する方法についてのヒントはもはや役に立ちません。それらをこれらのフレームワークの開発者に転送し、将来的にはより良い名前空間を選択することを期待できますが、当面は、単一のアプリケーション内でフレームワークを使用するソリューションを探しています。これを可能にする解決策はありますか?