実行時に手動で初期化コードを呼び出すことなく、iOS バージョンに基づいて、キャッシュされていない、完全ではないにしても、ほぼ事前に決定された値をアプリケーションに設定する方法はありますか?
アプリケーションの実行中に OS を常にチェックしたり、AppDelegate を介して呼び出しを行って実行時に多数のグローバル変数を初期化したりする必要があるソリューションを探しているわけではありません。
実行時に手動で初期化コードを呼び出すことなく、iOS バージョンに基づいて、キャッシュされていない、完全ではないにしても、ほぼ事前に決定された値をアプリケーションに設定する方法はありますか?
アプリケーションの実行中に OS を常にチェックしたり、AppDelegate を介して呼び出しを行って実行時に多数のグローバル変数を初期化したりする必要があるソリューションを探しているわけではありません。
コンパイル時にシステムのバージョンを確認することはできません。その情報は単に存在しません。
アプリの実行中に何度も再チェックすることを避けたいので、できる最善の方法は、プロセスの有効期間の非常に早い段階でチェックし、その情報を保存することです。これは、アプリケーション デリゲートに適したタスクである可能性があります。を取得application:didFinishLaunchingWithOptions:
したら、通常の実行時チェックを実行し、結果を必要とする他のコントローラーで利用できるようにします。または、気になる各コントローラーに、作成時にチェックを行わせます。
constructor
属性を使用して関数を作成することもできます。これは非常に早い段階で実行されます。これにより、グローバル変数をシステムバージョンで初期化するだけで、好きな場所にアクセスできます。main()
@JoshCaswell からのアドバイスを使用して、次の方法でこれを試みました。
static BOOL iOS6OrGreater;
__attribute__((constructor))
static void iOS6OrGreaterInitialization(){iOS6OrGreater = [[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] != NSOrderedDescending;}
static int MY_DEFINED_ENUM_NAME(){return (iOS6OrGreater) ? IOS6_OR_GREATER_ENUM : IOS5_OR_LESSER_ENUM;}
しかし、私は'UITextAlignmentCenter' is deprecated: first deprecated in iOS 6.0
警告を受けています。