2012-04-18 90 views
1

我已经在xCode 4.3.2上使用了我的iPhone项目,并且运行良好。它使用NSUbiquitousKeyValueStore类,它的基础SDK是iOS 5.0。 现在我要在xCode 3.2.5上构建我的项目,并且它说错误“未定义符号NSUbiquitousKeyValueStore”。 当然,我知道iOS 5.0支持NSUbiquitousKeyValueStore类,xCode 3.2.5不支持iOS 5.0。 因此,我想要禁用iOS 5.0以上的这些功能,并通过iOS 5.0启用。 我该怎么做?使用NSUbiquitousKeyValueStore生成xCode 3.2.5和xCode 4.3.2的xCode项目

回答

2

环绕,这使得与5.0 SDK中引入等,使得功能使用的代码:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000 
    // Code using NSUbiquitousKeyValueStore goes here 
#endif 

注意,这是有条件的编译。测试在构建时执行,而不是在运行时执行。因此,如果您在没有5.0 SDK的情况下生成旧版Xcode,那么无论您在哪里运行它,生成的程序都将会使用从不使用NSUbiquitousKeyValueStore。没有可行的方法来针对较旧的SDK进行构建,但如果它们在运行时可用,仍然会使用较新SDK的功能。

修改添加:有关更多信息,请参阅Apple的SDK Compatibility Guide

+0

谢谢你的回答。这正是我想知道的。 – ttotto 2012-04-18 07:58:12

0

您需要弱连接包含NSUbiquitousKeyValueStore类的框架。 然后在你的代码做一些喜欢的东西:

if ([NSUbiquitousKeyValueStore class]) { 
    // Class wil return non nil uf the class exists. 
    NSUbiquitousKeyValueStore *NSUbiquitousKeyValueStore = [NSUbiquitousKeyValueStore new]; 
} 
+0

如果针对甚至没有声明“NSUbiquitousKeyValueStore”的SDK构建,仍然无法编译。只有在您知道该符号的SDK进行编译时才会有效,但设置了一个早于该符号的部署目标。 – 2012-04-18 07:33:51

+0

确实,您需要将iOS部署目标设置得更低。 – rckoenes 2012-04-18 07:39:20

+1

不需要。关键是他正在构建一个根本不知道“NSUbiquitousKeyValueStore”的SDK。无论如何,你写的东西都不会在这种情况下建立起来。您所概述的技术有助于实现不同的场景:当他构建一个足够新的SDK但想要部署到较早的操作系统时。 – 2012-04-18 07:41:45