特定于版本的预处理器宏

uta*_*hak 4 iphone objective-c app-store ios c-preprocessor

我有一个预处理器命令,用于检测iOS的版本并支持或不支持iCloud.我想知道的是,如果像这样的宏:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000
    //stuff
#endif
Run Code Online (Sandbox Code Playgroud)

如果有iOS 4.x的人从应用程序商店下载应用程序,但它是在iOS 5.x上编译的,那么这项工作是否有效

由于这将在编译时评估是在设备上编译的应用程序或如何工作?是否有更好的方法来获得相同的结果?

Ben*_*tto 7

你不能使用宏.宏在编译时进行评估,而不是在运行时进行评估,这是您想要的功能/功能检测,如iCloud支持.(否则你最终会启用它,因为你在所有情况下都在编译 iOS 5 SDK)

您应该只测试普遍性方法的存在,它告诉您是否可以调用它们,它告诉您是否支持iCloud,例如:

if ([[NSFileManager defaultManager] respondsToSelector:@selector(isUbiquitousItemAtURL:)])    
{
    // call it and do other iCloud stuff
}
Run Code Online (Sandbox Code Playgroud)

快速跟进说明:关于编译的问题.编译是将实际代码转换为在设备上运行的二进制文件的过程.当您在Xcode中构建Build时会发生这种情况,它只发生在您的计算机上,而不会发生在Apple或设备上.这就是为什么版本号的编译时检查不起作用的原因 - 当你将它发送到设备时,就已经做出了决定.