Iphone 根据iOS版本有条件地包括标头
我正在尝试使用一个具有iOS5和iOS4.3风格的库。我遇到的问题是有条件地包含正确的版本,即: 对于iOS5:Iphone 根据iOS版本有条件地包括标头,iphone,objective-c,ios,Iphone,Objective C,Ios,我正在尝试使用一个具有iOS5和iOS4.3风格的库。我遇到的问题是有条件地包含正确的版本,即: 对于iOS5: #include ios5stuff.h @implementation // do stuff @end 对于iOS4 #include ios4stuff.h @implementation // do stuff @end 我可以看到如何在类的实现块中有条件地包含内容,但不能在这个块之外。有人能提出这样做的最佳方法吗? < P>如果你查看基础标头(NSCORT,NS
#include ios5stuff.h
@implementation
// do stuff
@end
对于iOS4
#include ios4stuff.h
@implementation
// do stuff
@end
我可以看到如何在类的实现块中有条件地包含内容,但不能在这个块之外。有人能提出这样做的最佳方法吗? < P>如果你查看基础标头(NSCORT,NSATATS…),有很多的
#if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
/* ... */
#endif
您应该能够做到这一点(未经测试):
#导入
#如果已定义(uuIphone_5_0)&&&uIphone_OS_0版本允许的最大值>=\uIphone_5_0
#导入“我的io5和以上的头文件”
#已定义的elif(uu IPHONE_u4_u3)和&&uu IPHONE_uOS_u版本u MAX_u允许>=\uu IPHONE_u4_u3
#导入“我的\u头\u用于\u ios4.3.h”
#否则
#错误:您的SDK太旧!至少需要4.3。
#恩迪夫
您可以使用DarkDust所说的方法,并在编译时检查IOS SDK版本,但通常更好的是,如果您在运行时处理这些内容,因为用户可以更新他们的设备,然后神奇地采用新功能或获得更好的操作系统集成
有几种方法可以做到这一点。在较新的SDK中,您应该有可用的NS\u类
。但是,如果您仍然支持较旧的SDK,则可能不支持。但这是objective-c,所以运气在我们这边:
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%的市场份额更新后,你才开始疏远老用户 可能重复:这些是编译时指令,因此,如果您使用iOS 5 SDK进行编译,则会包含这些指令。Poster说,他需要导入不同的头,具体取决于他链接的SDK。所以运行时解决方案显然太晚了;-)是的,我知道他要什么,而你的答案就是这个问题的真实答案。我正在挑战这一需求。不幸的是,我确实需要导入不同的标题-但这是在运行时检查事物状态的一个非常有用的摘要,谢谢。我在哪里可以找到使用已定义(uu IPHONE_5_0)或u IPHONE_OS_版本u MAX_0)的信息?
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.
}
if( [TheAppleClass instancesRespondToSelector:@selector(aMethod:)] ) {
// invoke the inherited method
[myInstance aMethod:parameter];
}