cocoamacoscore-services

Does it worth to have a ivar instead of doing Gestalt(gestaltSystemVersion, (SInt32*)&systemVersion)?


I want to support OSX 10.6 and 10.7 so I am doing some things conditionally. some of them are done several times in very short periods of time so I wonder if there is a gain in having a ivar that will tell me the systemVersion instead of doing

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

That will be used :

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

I've never used Gestalt in the past. Is Gestalt doing some kind of hard stuff or is cheap to call it every time?


Solution

  • Gestalt is incredibly cheap, especially when compared to something like running a separate sw_vers -productVersion to figure it out. That said, it certainly wouldn't hurt to cache it as a static variable in your implementation file. You could do something like this:

    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 is called once and (usually) only once, before an instance of that class is ever created. So, it provides a convenient place to make sure the static variable is properly determined before any of the objects are actually used.