2

OSX 10.6と10.7をサポートしたいので、条件付きでいくつかのことを行っています。それらのいくつかは非常に短い期間に数回行われるので、行う代わりにsystemVersionを教えてくれるivarを持つことに利益があるのだろうかと思います

SInt32 systemVersion
Gestalt(gestaltSystemVersion, (SInt32*)&systemVersion);

それが使用されます:

if (systemVersion >= 0x1070){ //OSX 10.7
}else{//OSX 10.6 
}

私は過去にゲシュタルトを使ったことがありません。ゲシュタルトはある種の難しいことをしているのですか、それとも毎回それを呼ぶのは安いですか?

4

1 に答える 1

4

Gestalt特にそれを理解するために別のものを実行するようなものと比較した場合、信じられないほど安いsw_vers -productVersionです。とはいえ、実装ファイルに静的変数としてキャッシュしても問題はありません。あなたはこのようなことをすることができます:

MDObject.m:

enum {
    MDUndeterminedVersion    = 0,
    MDTiger                  = 0x1040,
    MDLeopard                = 0x1050,
    MDSnowLeopard            = 0x1060,
    MDLion                   = 0x1070,
    MDMountainLion           = 0x1080,
    MDMavericks              = 0x1090,
    MDUnknownVersion         = 0x1100 // ??
};

static SInt32 MDSystemVersion = MDUndeterminedVersion;

@implementation

+ (void)initialize {
    if (MDSystemVersion == MDUndeterminedVersion) {
        SInt32 MDFullSystemVersion = 0;
        Gestalt(gestaltSystemVersion, &MDFullSystemVersion);
        MDSystemVersion = MDFullSystemVersion & 0xfffffff0;
    }
}

- (void)someMethod {
   if (MDSystemVersion >= MDLion) {

   } else {

   }
}

@end

+initializeそのクラスのインスタンスが作成される前に、一度だけ(通常は)一度だけ呼び出されます。したがって、オブジェクトを実際に使用する前に、静的変数が適切に決定されていることを確認するのに便利な場所を提供します。

于 2011-08-02T06:02:50.227 に答える