嗨,在我的一个应用程序中,我必须支持IOS6和IOS7的应用程序。为了实现这一点,我必须知道当前的设备版本。为此,我定义了一个宏,并尝试使用该宏作为参考来完成我的任务。我写的代码如下所示。
在.h文件中,我将IPhoneOSVersion定义为50000。
此代码位于.m文件中
if([[[UIDevice currentDevice] systemVersion] isEqualToString:@"7.0"])
{
#undef IPhoneOSVersion
#define IPhoneOSVersion 70000
NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion);
}
else
{
#undef IPhoneOSVersion
#define IPhoneOSVersion 60000
NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion);
}
NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion);如果我在IOS7中运行这段代码。在控制台中,数据必须在is 70000之后像这样打印_IPHONE_OS_VERSION_MIN_REQUIRED,但不幸的是,我在is 60000之后得到了_IPHONE_OS_VERSION_MIN_REQUIRED。甚至我在else条件下也设置了一个断点,但是它没有执行,但是宏值是changing.Can,任何人,请让我知道为什么宏值会发生这样的变化。
发布于 2013-10-01 14:33:06
你不应该针对操作系统版本进行硬编码,Apple推荐的支持多个操作系统版本的方法是检查某些特定的类、API、协议或函数,这允许更大的灵活性,因为其中一些东西有时是向后兼容的。
这里有一个相当不错的教程,介绍了如何在代码http://www.raywenderlich.com/42591/supporting-multiple-ios-versions-and-devices和苹果https://developer.apple.com/library/ios/documentation/developertools/conceptual/cross_development/Using/using.html的文档中检查特定资源的存在
编辑:为了回答为什么要修改宏的问题,编译器会遍历if-else的两个分支,从而使用宏的最后一个声明。你不能使用这样的宏并在运行时改变它,宏是在编译之前定义的。
发布于 2014-03-06 17:23:53
在Objective-C中使用预处理器的方式与在C或C++中完全相同。预处理器不关心if/else语句。它看到一个序列#undef,#define,#undef,#define,并一个接一个地执行它们,所以在最后一行中,最后一个#define生效。你不能用运行时发生的任何事情来影响这些#定义。
总是有三个操作系统版本在起作用:部署目标(即允许应用程序运行的最低操作系统版本)、SDK版本和运行时的实际版本。您在Xcode中设置的前两个版本;实际版本显然不受您的控制,除非您知道它与部署目标相同或高于部署目标。
SDK =部署目标__IPHONE_OS_VERSION_MAX_ALLOWED = __IPHONE_OS_VERSION_MIN_REQUIRED版本
发布于 2013-10-01 14:36:48
尝试使用
if([[[UIDevice currentDevice] systemVersion] floatValue] == 7.0)https://stackoverflow.com/questions/19109351
复制相似问题