【问题标题】:Using iPhone OS 3.0 function calls in place of deprecated 2.2 function calls on 2.2 devices在 2.2 设备上使用 iPhone OS 3.0 函数调用代替已弃用的 2.2 函数调用
【发布时间】:2010-01-06 21:10:01
【问题描述】:

如果我将 iPhone 应用的 Base + Active SDK 设置为 3.0,Deployment Target 设置为 2.2,我可以在 2.2 设备上使用新版本的功能吗?

例如,UITableViewCell 现在需要使用 [cell.imageView setImage:image] 设置图像,而在 2.2 中,您需要调用 [cell setImage:image]。使用新的[cell.imageView setImage:image] 会在 2.2 设备上崩溃吗?

【问题讨论】:

    标签: iphone deployment uitableview target deprecated


    【解决方案1】:

    不,您不能在 2.2 上调用 OS 3.0。不推荐使用的方法至少在 OS 3 中应该表现正常。在操作系统中的许多情况下,不推荐使用只是意味着 Apple 建议使用新方法而不是不推荐使用的方法;但这些方法将来也可能会消失。

    你有几个选择:

    1. 只需忽略警告,只要应用程序和方法在 OS 3.0 上实际运行即可。
    2. 进行运行时检查以确定操作系统版本,并调用适当的方法:

      double version = [[[UIDevice currentDevice] systemVersion] doubleValue];
      if (version >= 3.0) {
          [cell.imageView setImage:image];
      } else {
          [cell setImage:image];
      }
      

      或者更好:

      if ([cell respondsToSelector:@selector(imageView)]) {
           [cell.imageView setImage:image];
      } else {
           [cell setImage:image];
      }
      

      请注意,使用 ifdef 指令的编译时检查将不起作用

    3. 放弃对 OS 2.2 的支持。只针对 3.0 也是很合理的,因为 3.X 的使用率非常高。就我的小应用程序而言,12 月,在 2,058 个用户中,我在 3.0 之前的系统上有 27 个用户。不用说,此选项可显着减少您的测试需求。

    【讨论】:

    • 很公平 - 我希望系统能够在适当设置部署目标时在编译时整理出新的函数调用。就个人而言,我更喜欢使用if([cell respondsToSelector:@selector(imageView)]) 作为我的运行时检查,但我确信这是一个偏好问题;)
    • 我添加了您的建议。在我看来,responsesToSelector 肯定比操作系统检查更好,只是忘了它! Objective-C 是一种动态语言,因此方法不会在编译时得到解析。
    • 不错的一个。不过,我仍然很好奇 - [cell.imageView setImage:image] 会在 2.2 运行时崩溃吗?不幸的是,我没有要测试的 2.2 设备。
    • 是的,cell.imageView 会在运行时崩溃(它甚至不会到达 setImage 部分。
    • 是的,它会崩溃。如果您没有 2.2 设备,则不应将其作为目标。在推送它们之前,您应该对您的应用程序进行大量测试。模拟器有点帮助,因为您也可以更改 SDK 版本。
    【解决方案2】:

    不,您不能在 2.x 设备上使用 OS 3.0 调用。如果您甚至可以在 2.x 设备上安装面向 3.0 的应用程序,我会感到惊讶。

    【讨论】:

    • 嗨,我认为您误读了 - 部署目标设置为 2.2(根据 Apple 最佳实践)。
    • 这里有几件事在起作用:BASE SDK、Deploy 目标和 ACTIVE SDK。您可以将 BASE SDK 设置为您想要的任何内容,但是,特定于(例如)3.0 SDK 的 API 调用将不可用(即不会编译),直到 ACTIVE SDK 设置为 3.0 或更高版本。部署目标将允许您在 2.x 目标上安装 3.0-active-SDK,但它不会运行。
    • 所以我在 2.2 上调用 [cell.imageView setImage:image] 时会在运行时崩溃?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多