【问题标题】:How to test for the existance of a constant when creating a iPhone universal binary创建 iPhone 通用二进制文件时如何测试常量是否存在
【发布时间】:2010-07-29 22:53:08
【问题描述】:

我正在尝试创建一个通用二进制文件,它支持 iPhone 4 上的多任务处理,并且仍然可以在 iPad 上运行。

我知道如何通过使用 NSClassFromString 和“respondToSelector”检查类是否存在来避免不同版本的 iPhone IOS 的编译错误,但是有没有办法检查 UIBackgroundTaskInvalid 等常量是否存在?

我当然可以使用#IFDEF,但我想避免这种情况。

【问题讨论】:

标签: iphone binary universal


【解决方案1】:

你这样做:

if (NULL != &UIBackgroundTaskInvalid) {
   //do multitasking stuff here
} else {
   // don't do multitasking stuff here.
}

基本上你想验证那个变量的地址是否存在。

更新:需要明确的是,您不能真正为此使用#ifdef,因为您将使用包含符号的 SDK 版本进行构建。

【讨论】:

  • @Elfred:你赢了 ;-) 但看起来像是自找麻烦。
  • 在我必须为多任务重载的“applicationDidEnterBackground”选择器中,出现“NSAssert(backgroundTask == UIBackgroundTaskInvalid, nil);”的编译错误线。显然,在 iPad 上运行时不会调用此选择器,但如果我想使用 3.2 对其进行测试,它将无法编译。那么这样做的聪明方法是什么?
  • 您始终使用 iOS 4 SDK 构建并将部署目标设置为 3.2
  • 啊,我明白了。因此,为了测试,将部署目标设置为 3.2,但在编译分发时,将部署目标设置为 3.0。对吗?
  • 如果您的最低目标是 3.0,您可以将部署目标保留为 3.0。如果要在 iPad 上模拟,可以设置为 3.2 模拟器或者打开模拟器后更改设备类型。
【解决方案2】:

测试是否存在您知道与常量相关联的方法可能就足够了。

【讨论】:

  • 不是真的,因为我的常量必须仍然出现在代码中并且不会通过编译器测试。
  • 是的,只要您使用 BaseSDK 4.0 编译,所有 4.0 常量都将被定义,但您不应在
【解决方案3】:

检查多任务 iOS 的首选方法是查看 UIDevice 是否响应 isMultitaskingSupported,如下所示:

//----------------------------------------------------------------------
// returns YES if multitasking is available (iOS 4.0 or >)
//----------------------------------------------------------------------
BOOL hasMultitasking() 
{
    UIDevice* device = [UIDevice currentDevice];
    if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
        return [device isMultitaskingSupported];
    }
    return NO;
}

如果支持多任务,那么您可以使用那些与多任务相关的常量,您应该与这些常量进行弱链接。

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2021-04-18
    相关资源
    最近更新 更多