3

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

我想使用一个只能在 iOS 4.3 及更高版本上运行但仍支持 4.0 及更高版本的类。为了实现这一点,我断言如果我尝试在 iOS 版本低于 4.3 的设备上使用这个类。为了避免断言,我通过检查 4.3 方法的可用性来避免代码中的类。部署目标当前设置为 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,这就是我问这个问题的原因。

4

2 回答 2

3

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

于 2012-04-27T11:33:31.627 回答
3

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

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

于 2012-04-27T13:01:58.643 回答