2012-03-08 1 views
1

iPadとiPhoneランタイムの異なる@propertiesを作成します。各デバイスの特性を合成する。私の場合のように、ユーザーがiPhoneでアプリを開くと、iPhone固有の@propertiesだけを作成する必要があります。また、iPadで実行されているアプリのためにも同じです。私はユニバーサルアプリを持っており、各デバイス(iPadで、iPhone)のために、このような性質の異なるセットを持って

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

これを行うにはどのような方法がありますか、これを処理するためのより良い方法があります:

はこれを延期するコンパイル時のいずれかのディレクティブは、そのようなことは、ありますか?

ありがとうございます!

答えて

5

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

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

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

+0

私はそのプロパティ自体が大したことではないことを知っています。しかし、この特性が合成されるとどうなりますか? –

+0

魔法はありません。コンパイラは、そのプロパティのgetterメソッド(およびsetterメソッド)を生成します。 4バイト以上の間は、コードと関連するシンボル情報はまだ多くは加算されません。アプリ内の典型的な画像のサイズと比較すると、それはまったく重要ではありません。 –

+0

私はこれを試してみます。ありがとう! –

3

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

  1. は、両方のコントローラの一般的な振る舞いを反映@protocolを作成します。
  2. 両方のコントローラがこのプロトコルに準拠する必要があります。つまり、動作を実装する必要があります。
  3. 作成ONE @property等:

    @property(アトミック、保持)ID < YourProtocolName> categoriesController。

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

これにより、より洗練されたアーキテクチャが実現します。 良い一日;)

+0

それは良い点です。私はそれを試してみます。ありがとう! –

+0

もう1つ:これはまた、このプロパティに@protocolに適合するすべてのコントローラを注入することができるため、アプリケーションをより普遍的なものにします。 – SVGreg

関連する問題