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