Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 用ivar代替格式塔(格式塔系统版本,(SInt32*)和系统版本)值得吗?_Cocoa_Macos_Core Services - Fatal编程技术网

Cocoa 用ivar代替格式塔(格式塔系统版本,(SInt32*)和系统版本)值得吗?

Cocoa 用ivar代替格式塔(格式塔系统版本,(SInt32*)和系统版本)值得吗?,cocoa,macos,core-services,Cocoa,Macos,Core Services,我想支持OSX 10.6和10.7,所以我有条件地做一些事情。 其中一些是在很短的时间内完成多次的,所以我想知道是否有一个ivar可以告诉我系统版本,而不是执行 SInt32 systemVersion Gestalt(gestaltSystemVersion, (SInt32*)&systemVersion); 这将用于: if (systemVersion >= 0x1070){ //OSX 10.7 }else{//OSX 10.6 } 我过去从未使用过格式塔。格式塔是

我想支持OSX 10.6和10.7,所以我有条件地做一些事情。 其中一些是在很短的时间内完成多次的,所以我想知道是否有一个ivar可以告诉我系统版本,而不是执行

SInt32 systemVersion
Gestalt(gestaltSystemVersion, (SInt32*)&systemVersion);
这将用于:

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

我过去从未使用过格式塔。格式塔是在做一些困难的事情,还是每次调用它都很便宜?

格式塔
非常便宜,尤其是与运行单独的
sw\u-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
被调用一次并且(通常)只调用一次。因此,它提供了一个方便的地方,确保在实际使用任何对象之前正确确定静态变量。

您确实是NSGod!非常感谢:)我想现在我们知道了
MDUnknownKitty
实际上是
MDMountainLion
:)