1

私はユニバーサル アプリを持っており、各デバイス (iPad、iPhone) には、次のような異なるプロパティ セットがあります。

//iPhone
@property (nonatomic, strong) CategoriesViewController *categoriesViewController;
//iPad
@property (nonatomic, strong) UIPopoverController *categoriesPopoverController;

しかし、各デバイスのプロパティを合成するメモリを無駄にしたくありません。私の場合のように、ユーザーが iPhone でアプリを開いた場合、iPhone 固有の @properties のみを作成する必要があります。また、iPad で実行されているアプリの場合も同様です。

これを延期するためのコンパイル時のディレクティブはありますか?

#if UI_USER_INTERFACE_IDIOM() = iPhone
//create iPhone properties
#elseif UI_USER_INTERFACE_IDIOM() = iPad
//create iPad properties

これを行う方法はありますか、またはこれを処理するためのより良い方法はありますか?

ありがとう!

4

2 に答える 2

5

あなたが求めていることを正確に行う方法はありません。

  1. この余分なメモリ使用量は本当に重要ですか? そのようなプロパティは、オブジェクトのインスタンスごとにわずか 4 バイトです。インスタンスが 1 つ (または数個) しかないコントローラーのようなものである場合、これについて話す価値さえありません。

  2. 本当にこれを行う必要がある場合は、抽象基底クラスを作成してから、iPad および iPhone バージョンのサブクラスを作成することを検討してください。実行時に、UI_USER_INTERFACE_IDIOM()インスタンス化するクラスを決定するために使用します。

于 2012-03-08T09:50:25.963 に答える
3

これは、このような問題を解決するための標準的な Objective C の方法です。

  1. 両方のコントローラーの共通の動作を反映する @protocol を作成します。
  2. 両方のコントローラーがこのプロトコルに準拠する必要があります。つまり、動作を実装します。
  3. 次のような 1 つの @property を作成します。

    @property (非アトミック、保持) id < YourProtocolName > categoryController.

  4. iPad または iPhone 関連のコントローラーを、categoriesController にインスタンス化します。

これにより、アーキテクチャがよりエレガントになります。良い1日を ;)

于 2012-03-08T10:44:51.643 に答える