不同版本的Mac OS X之间是否有单独的代码?

时间:2012-09-25 08:38:36

标签: objective-c macos cocoa macros

我想要一些代码在10.6及以下编译,但不是10.7及以上。

例如:

#ifdef current version is MAC_OS_X_VERSION_10_6 or below

// do this

elif current version is MAC_OS_X_VERSION_10_7 or above 

//do that

#endif

有人可以帮我找到合适的宏吗?我查看了AvailabilityMacros.h,但未能找出正确的ifdef。

我有一个动态库,它不能在10.7及以上版本下加载,但在10.6下正确加载。这是由私人符号_CGContextAppendPath引起的。我希望在10.6及以下版本下使用它,但要避免在10.7及以下版本中使用它。这是因为10.7及更高版本上不存在_CGContextAppendPath符号。

我用过,

SInt32 version = 0;
Gestalt( gestaltSystemVersion, &version );

bool lionabove = ( version >= 0x1070 );

没用。

2 个答案:

答案 0 :(得分:2)

对于目标C,首选路线是通过例如检查特定API的可用性。 [object respondsToSelector:]

对于您正在使用的C库,弱链接到CoreGraphics.framework(因此当某些函数不存在时加载不会失败)并通过{{1}检查相关函数的可用性}。

http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Configuring/configuring.html#//apple_ref/doc/uid/10000163i-CH1-107837http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-1114537-BABHHJBC中的详细信息。

答案 1 :(得分:0)

Apple为iOS和Mac OS 10.6及更高版本(位于Availability.h)引入了一个新的<SDK>/usr/include/Availability.h宏文件。你可以这样做:

#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070
    // code to run up through 10.6
#else
    // code to run on 10.7 or higher
#endif

请注意,此宏也可用(根据您的逻辑,这可能更好):

#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
    // code to run on 10.7 or above
#else
    // code to run below 10.7
#endif    

此处的文档位于:Conditionally Compiling for Different SDKs,如果您要混合iOS和Mac OS X代码,尤其值得一看。我还强烈建议您阅读上面提到的头文件。