2011-08-02 1 views
2

私はOSX 10.6と10.7をサポートしたいので、条件付きでいくつかのことをやっています。 それらのいくつかは、私は私にsystemVersionを教えてくれますIVARを持つ代わりに使用されますGestalt(gestaltSystemVersion、(SInt32 *)&systemVersion)を実行する代わりに、ivarを持つ価値はありますか?

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

やってゲインがあるかしら時間の非常に短い期間に数回行われています。

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

私は過去にゲシュタルトを使ったことがありません。ゲシュタルトは何かのハードなことをしているのですか、毎回それを呼び出すのは安いですか?

答えて

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

+0

あなたは本当にNSGodです!ありがとうございました:) – nacho4d

+0

私たちは 'MDUnknownKitty'が実際に' MDMountainLion'であることを知りました:) – nacho4d

関連する問題