如何检查预处理器宏中的条件?

时间:2012-12-31 05:57:53

标签: iphone ios macros

  

可能重复:
  How to import Social framework only for iOS 6?

需要检查预处理器宏中的条件。

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */



if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0"))
{
#import <Social/SLServiceTypes.h>
#import <Social/SLRequest.h>
#import <Social/Social.h>
#import <Social/SocialDefines.h>
}

3 个答案:

答案 0 :(得分:1)

您无法在运行时导入文件。 imports在编译时工作。 由于上面的宏使用的方法将在运行时计算值,所以我不认为你想要实现的是什么

答案 1 :(得分:1)

如上所述,#import是一个编译时指令 - 所有预处理器指令(以#开头的东西)都是。所以你在这里尝试做的事情将不会像你期望的那样发挥作用。

只要你只使用最新的SDK构建,你就不需要有条件#import标题 - 无论你为什么建立目标iOS版本,都可以使用最新的标题。 。

如果您的代码需要在不同的SDK版本下构建 - 例如如果你的队友的机器无法运行最新的Xcode,那就是条件导入的时间。但由于这是编译时的事情,您需要针对SDK版本进行编译时检查,而不是运行时检查。使用类似的东西:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
// building with iOS 6 SDK, safe to import Social framework
#endif

但是,如果您希望使用较旧的SDK 构建代码,则只需要执行类似的操作。

如果您希望自己的应用在较旧的iOS版本上运行,但希望有条件地使用新的iOS功能,则需要运行时检查。您还需要使用weak linking。但即便如此,Apple仍建议您避免检查版本号 - 最好检查所需的特定功能。例如,如果要使用Social框架,则弱链接整个框架(i.e. make it Optional),然后在使用之前检查所需类的存在:

if ([SLComposeViewController class] {
    SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    // ...
}

为什么要避免版本号检查?好吧,假设您在尝试使用社交框架API之前检查了大于5.1的iOS版本...然后假设Apple发布了另一个5.1.x更新来修复安全漏洞。现在,您的应用程序认为它是在具有社交框架的版本上,尝试使用它,崩溃,并在App Store上获取不良评论。如果你检查6.0 ...那么Apple可能会改变他们对shafting原始iPad用户的想法,并发布5.x更新,至少让我们拥有 iOS6功能的一些,包括Social?现在,您的应用不会崩溃,但它也不会让您的用户拥有新的iOS功能 - 再次使用一星评价。

答案 2 :(得分:0)

结构非常简单:#IF ... #ENDIF

以下是一些有用的链接: FirstSecondThird