Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 根据iOS版本有条件地包括标头_Iphone_Objective C_Ios - Fatal编程技术网

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

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

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

对于iOS5:

#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];
}