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
вызывается один раз и (обычно) только один раз перед созданием экземпляра этого класса. Таким образом, он обеспечивает удобное место для проверки правильности определения статической переменной перед тем, как какой-либо объект будет фактически использован.