Стоит ли иметь ивар вместо того, чтобы делать гештальт (gestaltSystemVersion, (SInt32 *) и systemVersion)? - PullRequest
2 голосов
/ 02 августа 2011

Я хочу поддерживать OSX 10.6 и 10.7, поэтому я делаю некоторые вещи условно.некоторые из них выполняются несколько раз за очень короткие промежутки времени, поэтому мне интересно, есть ли выигрыш в использовании ивара, который сообщит мне systemVersion вместо выполнения

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

, которое будет использоваться:*

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

Я никогда не использовал Гештальт в прошлом.Гештальт делает какие-то сложные вещи или дешево каждый раз звонить?

1 Ответ

4 голосов
/ 02 августа 2011

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

...