32

Objective-c / CocoaとxCodeを使用して、MacOSX用に構築しているクライアント<=>サーバーアプリがあります。私は自分が持っている両方のアプリに対して異なるプロジェクトを作成しましたが、それらの間でクラスを共有するための最良の方法を考えています。両方に役立つクラスがいくつかあります。これまで私はそれらをコピーしてきましたが、これは最善の解決策ではないと感じています。

クラスを効果的に共有するにはどうすればよいですか?1つのプロジェクトとしてやり直し、ビルドターゲットを2つだけにする必要がありますか?どうすればよいですか?

他の情報はありますか?

ありがとう。

4

6 に答える 6

14

製品スイートのように、大量の共通コードを共有する2つ以上の製品がある場合は、単一のxcodeプロジェクトを作成することを検討してから、ビルドされる製品ごとに異なるターゲットを追加することをお勧めします。共有コードと製品固有のコードの両方から。多くの共有コードがある場合、クライアント/サーバーの製品ペアは、この方法を採用するための優れた候補になる可能性があります。

要約すると、基本的な取り決めは、ビルドするxcodeプロジェクトのターゲットごとに、ソースファイル、アート、xibsなどのビルドに使用するファイルを指定することです。このようにして、たとえば、ファイルA、B、C、D、E、Fを使用してビルドするクライアント製品と、ファイルA、F、X、Y、Zを使用してビルドするサーバー製品をセットアップできます。

すべての関連製品を単一のxcodeプロジェクト「屋根」の下に置くのが本当に好きです。なぜなら、xcodeプロジェクトを飛び回る必要がなく、共有ファイルのSCM管理が本当に簡単になるからです。

これに関するAppleのドキュメントへのリンクは次のとおりです:https ://developer.apple.com/library/mac/#featuredarticles/XcodeConcepts/Concept-Targets.html

更新:xcodeでターゲット固有のヘッダーファイルを構成する場合は、少し面倒です(常に何か...正しいですか?!)。たとえば、このターゲットには「myHeaderA.h」を使用し、そのターゲットには「myHeaderB.h」を使用します。これは、その方法を共有するすばらしい投稿です。Xcodeに含まれるプロジェクトヘッダーファイルを制御します。注意:このように設定すると、xcodeはターゲットヘッダーファイルを検索するためのパスを認識しなくなるため、手動で設定する必要があります。これを行うには、ターゲットの[情報を見る]を右クリックし、[ビルドカテゴリ]を選択して、[ヘッダー検索パス]設定からパスを追加します。パスは、入力した順序で検索されます。

于 2010-07-18T23:24:42.097 に答える
13

これを行うための非常に良い方法は、共有コードをSCMシステムに入れて、必要な各プロジェクトに含めることです。このようにして、すべてのプロジェクトでコードを共有でき、どこでも編集して、変更をソース管理に戻すことができます。あなたがそれについて気分が良いとき—そして他のすべてのプロジェクトはあなたの仕事から利益を得ます。

これには、IMOを実行する他の方法に比べて大きな利点があります。

対フレームワーク:コードをフレームワークにパッケージ化するのはかなり面倒であり、バンドルプライベートフレームワークのロードには、特にいくつかのクラスをアプリに取り込むためだけに、不当に長い時間がかかります。OmniGroupのWilShipley(当時)は、会社がすべてのアプリに含めているフレームワークが、各アプリの開始時間に数秒を追加していることをかつて発見しました。プライベートクラスをフレームワークにパッケージ化すると、厳密に必要な以上の結合が促進される可能性があります。すべての共有クラスが存在するOne True Frameworkを作成するだけで本当に魅力的であるため、このコードは常に共存すると想定し始めます。そしてそれは不可分になります。基本的に、フレームワークはハンマーであり、この問題はネジです。

対ファイルを含めるだけ:とにかく、ある時点でアプリをSCMに配置し、ファイルをインプレースに含めるだけでSCMから欠落するため、問題が発生することを願っています。ファイルを各プロジェクトにコピーすると、逆の問題が発生します。各プロジェクトには独自のバージョンのファイルが含まれるため、有用な変更を手動で伝達する必要があります。

于 2010-05-17T17:02:21.440 に答える
4

最良の方法は、共有クラスを含む別のフレームワークを作成することです。これは一度コンパイルして、両方のアプリケーションプロジェクトにリンクできます。

フレームワークとは何かについては、Appleのドキュメントを参照してください。

于 2010-01-24T12:33:44.850 に答える
2

最速の解決策は、プロジェクトの1つに.hファイルと.mファイルの参照のみを追加することです。「コピー」のチェックを外すだけです-「既存のファイルを追加」のチェックボックス-xcodeのダイアログ。プロジェクトを移動/共有する場合は、参照ファイルをコピーする必要がある場合もあることに注意してください。

于 2010-01-24T15:33:28.233 に答える
2

私も同様の問題を抱えていましたが、上記の回答が受け入れられると、初心者にとって問題が発生する可能性があります。

2つのプロジェクトがTCP/IPなどのプロトコルで通信する場合、または通信しない場合は問題ありません。ただし、1つのプロジェクトがアプリケーションと同じクラスにアクセスする必要があるバンドル(プラグインなど)である場合(同じプロセスで実行されている間)、同じ名前のクラスを持つことに関するリンクまたは実行時の警告/エラーに関する問題が発生します。この問題を解決する最も簡単な方法は、フレームワークを使用することです。フレームワークを使用すると、3つのターゲットすべてが同じプロジェクトに含まれるように設定できます。また、フレームワークを別々のプロジェクトに含めることもできます。

アプリとバンドルプラグインを使用したプロジェクトがありました。Xcode6で実行した手順は次のとおりです。

  1. フレームワークを作成し、すべての共有コードをコピーします。
  2. フレームワークのメインヘッダーに、すべての共有コードのヘッダーを含めます。
  3. フレームワークをビルドして、ビルドをテストします(たとえば、フレームワークのスキームを選択して、[再生]をクリックします)
  4. アプリケーションとプラグインバンドルの両方のビルドフェーズセクションに移動し、新しいフレームワークを「ターゲットの依存関係」と「ライブラリとのバイナリのリンク」に追加します。</ li>
  5. アプリとバンドルのコードにフレームワークのものを含めるには、メインヘッダーを使用し、「」ではなく<>を使用します。たとえば、フレームワークがFooと呼ばれる場合は#importを使用します。

フレームワークへの変更は、メインアプリを実行すると自動的にコンパイルされるため、実際には、それらが異なるターゲットであるという事実を無視できます。

于 2014-08-01T12:16:09.163 に答える
1

このトピックに関する素晴らしい記事をここで見つけました:http ://www.clintharris.net/2009/iphone-app-shared-libraries/これは、コードを共有する複数のiPhoneアプリに関する私の質問に答えます。フレームワーク(上記)については言及されていないため、彼らの提案(xcodeプロジェクト参照)がフレームワークソリューションと比べて遜色がないかどうかはわかりません。

于 2010-05-17T16:46:46.450 に答える