特定版本的预处理宏

4

我有一个预处理命令来检测iOS版本并支持iCloud。 我想知道是否可以使用以下宏:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000
    //stuff
#endif

如果某人使用iOS 4.x从应用商店下载应用程序,但它是在/为iOS 5.x编译的,这是否有效。

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

1个回答

7
你不能使用宏来完成这个任务。宏是在编译时评估的,而不是在运行时评估的,对于像iCloud支持这样的功能/能力检测,你需要运行时评估。(否则,在所有情况下,由于您正在针对iOS 5 SDK进行编译,将会使其启用)
你只需要测试ubiquity方法的存在性,这将告诉你是否可以调用它们,从而告诉你是否支持iCloud,例如:
if ([[NSFileManager defaultManager] respondsToSelector:@selector(isUbiquitousItemAtURL:)])    
{
    // call it and do other iCloud stuff
}

关于您关于编译的问题,这里有一个简短的跟进说明。编译是将您的实际代码转换为在设备上运行的二进制代码的过程。这个过程发生在您在Xcode中进行构建时,仅在您的计算机上进行,从不在苹果公司或设备上进行。这就是为什么版本号的编译时检查不起作用的原因 - 当您将其发送到设备时,决策已经被做出。


谢谢,我不确定,不想提交会在许多设备上崩溃的代码。建议的代码很有效。 - utahwithak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接