__IPHONE_OS_VERSION_MIN_REQUIRED不会返回部署目标?

时间:2012-04-27 11:26:10

标签: iphone ios xcode backwards-compatibility

为什么__IPHONE_OS_VERSION_MIN_REQUIRED返回基本SDK而不是部署目标?

我想使用一个只能在iOS 4.3及更高版本上运行的类,但仍支持4.0及更高版本。为了实现这一点,我断言如果我尝试在iOS版本低于4.3的设备上使用此类。为了避免断言,我通过检查4.3方法的可用性来避免类in-code。部署目标当前设置为4.0。

但是,因为断言只会在我在旧设备上运行应用程序时发生,所以如果部署目标小于4.3,我还想添加警告。我正在尝试使用__IPHONE_OS_VERSION_MIN_REQUIRED。但是,这会以某种方式继续返回50000(基本SDK)而不是43000以下的某些内容,我无法弄清楚原因。

代码:

NSLog(@"Deployment target: %i", __IPHONE_OS_VERSION_MIN_REQUIRED); // Returns 50000 instead of 40000.
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 43000
// Never gets here
NSLog(@"%@", @"WARNING! NWMethodWrapper does not work on iOS versions below 4.3. If you insist on supporting older iOS versions, make sure you do not call NWMethodWrapper methods unless dlsym(RTLD_DEFAULT,\"imp_implementationWithBlock\") evaluates to true.");
#endif
NSAssert(dlsym(RTLD_DEFAULT,"imp_implementationWithBlock"), @"NWMethodWrapper uses methods that are only available from iOS 4.3 and later."); // Asserts, as appropriate (running on iOS 4.2.1).

编辑:我的部署目标已设置为4.0,这就是我提出问题的原因。

2 个答案:

答案 0 :(得分:3)

如果您没有自己定义__IPHONE_OS_VERSION_MIN_REQUIRED__IPHONE_OS_VERSION_MIN_REQUIRED最终由编译器(通过“AvailabilityInternal.h”中的宏)设置,以匹配您的最小iphone操作系统版本设置为,所以你需要确保你的部署目标设置为早于iOS 5.0的东西。

答案 1 :(得分:3)

您必须确保行为类似的Class实际上是相关项目的一部分,而不是通过工作区访问的另一个项目的一部分。这些项目可以设置为自己的部署目标,这些目标不必与您在主项目中期望的部署目标相同。

在我的例子中,类的部署目标设置为5.0(而不是我的主项目,设置为4.0),这意味着__IPHONE_OS_VERSION_MIN_REQUIRED按预期工作。