根据iOS版本有条件地包括标题

时间:2011-10-11 12:19:32

标签: iphone objective-c ios

我正在尝试使用具有iOS5和iOS4.3风格的库。我遇到的问题是有条件地包括正确的版本,即:

for iOS5:

#include ios5stuff.h
@implementation
  // do stuff
@end

适用于iOS4

#include ios4stuff.h
@implementation
  // do stuff
@end

我可以看到如何在类的实现块中有条件地包含东西,但不在此之外。有人能建议这样做的最好方法吗?

3 个答案:

答案 0 :(得分:18)

你应该可以这样做(未经测试):

#import <Availability.h>

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
#import "my_header_for_io5_and_above.h"
#elif defined(__IPHONE_4_3) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_3
#import "my_header_for_ios4.3.h"
#else
#error Your SDK is too old ! Need at least 4.3.
#endif

答案 1 :(得分:1)

如果你看一下Foundation头文件(NSString,NSData ......),有很多

#if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0  <= __IPHONE_OS_VERSION_MAX_ALLOWED
/* ... */
#endif

还有

的定义
__IPHONE_OS_VERSION_MIN_REQUIRED

答案 2 :(得分:0)

您可以使用this方法或DarkDust所说的方法,并在编译时检查IOS SDK版本,但通常更好的是,如果您在运行时处理这些内容,因为用户可以更新其设备,然后神奇地采用新功能或获得更好的操作系统集成。

有几种方法可以做到这一点。在较新的SDKS中,您应该拥有NS_CLASS_AVAILABLE。但是,如果您仍然支持较旧的SDK,则可能不会。但这是客观的,所以运气就在我们这边:

Class cls = NSClassFromString (@"NSRegularExpression");
if (cls) {
    // Create an instance of the class and use it.
} else {
    // Alternate code path to follow when the
    // class is not available.
}

基本上它的工作方式是询问类型系统是否有可用的类,如果没有,则返回null。如果没有经过测试,这有点危险,因为它是一个字符串并且会编译,但你应该能够处理它。

如果它是两个地方都存在的类,您可以在运行时测试选择器可用性,如下所示:

if( [TheAppleClass instancesRespondToSelector:@selector(aMethod:)] ) {
    // invoke the inherited method
    [myInstance aMethod:parameter];
}

reference1 reference2

通过这样做,你可以提供一个仍然支持带有自定义推文表的OS4.2用户的构建,但是当它们升级时,它们会自动获得OS twitter集成。但是,它仍然只是一个单独的构建,您可以在需要时释放,而无需等待90%的市场更新,然后再开始疏远较旧的OS用户。