2013-08-23 50 views
7

所以问题来了。我准备尽快为iOS发布更新,以解决iOS 7中的一些问题。为此,我需要使用一些特定的iOS 7功能/类型。我已经绝对确信,iOS 7代码只能在iOS 7上执行,并且会在iOS 7之前回退到不同的代码。当然,我不允许使用当前的Xcode测试版进行提交,因此我试图编译与当前的Xcode版本。不过,我似乎无法找到一个方法来禁用此特定的警告:编译器的条件隐藏代码

Use of undeclared identifier '<Redacted>'.

有谁知道的方式使用#pragma禁用此警告。我已经尝试了很多不同的人,包括

-w-Weverthing-Wall

,但似乎没有任何工作。

UPDATE 回答:你当然不能,因为编译器不能编译一个它一无所知的标识符。我的解决方案是简单地创建一个#define

#define <redacted> 1

更新2 下面实际上使人们更容易的答案。我已经创建了#define Xcode5Code(code, alt),它允许我有条件地执行代码块。通过使用由@maddy解决方案修改它:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
    #define Xcode5Code(code, alt) code 
#else 
    #define Xcode5Code(code, alt) alt 
#endif 

这让我很容易地通过使用隐藏的来自编译器的代码块:

Xcode5Code({ 
    //Code to be execute only with Xcode 5 
}, { 
    //code to be executed in previous versions of Xcode 
}) 

使用#define Xcode5Code的主要好处是,Xcode中会自动为您完成,这比使用完整的#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000更容易,Xcode不会自动完成。

这实际上并不能区分iOS 7和iOS 7之前的设备。它只区分当前Xcode可以处理的iOS版本。区分我使用的iOS设备版本:

NSUInteger DeviceSystemMajorVersion(void) { 
    static NSUInteger _deviceSystemMajorVersion = -1; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue]; 
    }); 
    return _deviceSystemMajorVersion; 
} 

上面是Apple的代码,顺便说一下。为了在NDA上跳舞,我会说这有助于展示根控制器的视图,因为这取决于您使用的Xcode版本和设备上的iOS版本。如果你试图管理测试版和生产代码,这可以帮助很多。一旦您可以使用Xcode 5提交应用程序,则不再需要#define Xcode5Code

+0

这不是一个警告,这是一个错误。你希望编译器如何操作一个它不知道的标识符? – Mat

+0

这是一个警告吗?看起来更像是一个错误。 – trojanfoe

+0

@Mat啊......当然是啊。显然我今天需要更多咖啡。是的,这是一个错误,当然我不能指望编译器编译一些它一无所知的东西。 –

回答

22

如果你想在Xcode两个差异版本或两个不同的基地SDK的设置,那么你应该使用编译器指令编译您的应用程序:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported 
    // iOS 7 code here 
#else 
    // Pre-iOS 7 code here 
#endif 

不要用这个运行时检查。只有在您必须使用两种不同版本编译代码时才能使用此解决方案。一个例子是你添加了iOS 7代码,但你仍然需要用Xcode 4.6编译代码。使用编译指令可让您使用较旧的Base SDK从编译器“隐藏”iOS 7代码。

请参阅文档中的“SDK兼容性指南”以获取有关此更正和运行时检查的更多信息。