是否值得拥有一个ivar而不是格式塔(gestaltSystemVersion,(SInt32 *)& systemVersion)?

时间:2011-08-02 03:51:06

标签: cocoa macos core-services

我想支持OSX 10.6和10.7,所以我有条件地做一些事情。 其中一些在非常短的时间内完成了几次,所以我想知道是否有使用ivar告诉我systemVersion而不是做

的收获
SInt32 systemVersion
Gestalt(gestaltSystemVersion, (SInt32*)&systemVersion);

将使用:

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

我过去从未使用过格式塔。格式塔是做某种艰难的事情还是每次打电话都很便宜?

1 个答案:

答案 0 :(得分: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被调用一次并且(通常)只调用一次。因此,它提供了一个方便的位置,以确保在实际使用任何对象之前正确确定静态变量。