我想支持OSX 10.6和10.7,所以我做了一些有条件的事情。其中一些在很短的时间内完成了几次,所以我想知道是否有一个ivar会告诉我systemVersion而不是执行
SInt32 systemVersion
Gestalt(gestaltSystemVersion, (SInt32*)&systemVersion);
将被使用:
if (systemVersion >= 0x1070){ //OSX 10.7
}else{//OSX 10.6
}
我以前从来没用过格式塔。格式塔是在做一些困难的事情,还是说它每次都是廉价的?
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
被调用一次(通常)只调用一次,在该类的实例被创建之前。因此,它提供了一个方便的地方来确保在实际使用任何对象之前正确确定静态变量。