7

所以这就是问题所在。我准备很快为 iOS 发布一个更新,它将解决 iOS 7 中的一些问题。为此,我需要使用一些特定的 iOS 7 功能/类型。我已经完全确定 iOS 7 代码只会在 iOS 7 上执行并回退到 iOS 7 之前的不同代码。当然,我不允许使用当前的 Xcode beta 提交,所以我正在尝试编译与当前的 Xcode 版本。但是,我似乎找不到禁用此特定警告的方法:

Use of undeclared identifier '<Redacted>'.

有谁知道使用#pragma. 我尝试了很多不同的方法,包括

-w, -Weverthing,-Wall

但似乎没有任何效果。

更新 答案:当然,您不能,因为编译器无法编译它一无所知的标识符。我的解决方案是简单地创建一个#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 会为你自动完成它,这比使用 full 容易得多#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就不再需要了。

4

1 回答 1

22

如果你想用两个不同版本的 Xcode 或两个不同的 Base 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 编译代码。使用 compile 指令可以让您使用较旧的 Base SDK 对编译器“隐藏” iOS 7 代码。

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

于 2013-08-23T15:14:59.700 回答