我正在尝试使用具有iOS5和iOS4.3风格的库。我遇到的问题是有条件地包括正确的版本,即:
for iOS5:
#include ios5stuff.h
@implementation
// do stuff
@end
适用于iOS4
#include ios4stuff.h
@implementation
// do stuff
@end
我可以看到如何在类的实现块中有条件地包含东西,但不在此之外。有人能建议这样做的最好方法吗?
答案 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];
}
通过这样做,你可以提供一个仍然支持带有自定义推文表的OS4.2用户的构建,但是当它们升级时,它们会自动获得OS twitter集成。但是,它仍然只是一个单独的构建,您可以在需要时释放,而无需等待90%的市场更新,然后再开始疏远较旧的OS用户。