【问题标题】:What are the disadvantages of using presentModalViewController which is now deprecated in iOS 6?使用现在在 iOS 6 中已弃用的 presentModalViewController 有什么缺点?
【发布时间】:2012-12-12 05:05:47
【问题描述】:

我希望我的 iphone 应用程序也可以在旧的 iOS 版本上运行,所以我使用的是 presentModalViewController,但同时我担心它可能带来的灾难,因为我使用了一种已弃用的方法。

谢谢。

【问题讨论】:

  • presentViewController:animated:completion:是iOS5及以上,所以不用presentModalViewController:animated:
  • “使用现在已弃用的 presentModalViewController 有什么缺点” - 在问题中回答 - 已弃用。
  • 感谢 presentViewController 提示。但我仍然想知道使用不推荐使用的方法会带来什么缺点?
  • 不推荐使用已弃用的方法,因为它们将在以后的版本中删除,但它们仍然有效

标签: objective-c ios xcode


【解决方案1】:

H2CO3 是完全正确的:不使用已弃用功能的原因是 Apple 已向我们发出公平警告,即已弃用的 iOS 未来版本可能不支持它,因此您的应用可能无法在未来版本上运行iOS 的。新的presentViewController 为您提供了已弃用方法的所有功能,并为您提供了completion 块的选项。也许您不需要它(在这种情况下,您只需传递nil),但这不是使用已弃用功能的理由。

如果您计划在新方法所需的 iOS 版本(在本例中为 iOS 5)之前支持 iOS,则应仅使用已弃用的方法,如果您这样做,则应有条件地仅使用已弃用的方法对于那些旧版本(即正如史蒂夫建议的那样,检查您的对象 respondsToSelector 是否适用于新方法,如果是则使用该新方法,如果不使用旧版本)。

【讨论】:

  • 可能 iOS 的历史太短了,太清楚了。在 Mac 上,事情从弃用变为不可用。然而,通常情况下,即使您不能再使用某些功能,使用它构建的应用程序早几年仍然可以工作(这就是为什么我的 Mac 上的一些应用程序在 10 年或更长时间后仍然可以工作)。当然,在未来的某个时候,API 将被删除,您将无法使用此方法进行构建。但是您现在构建的应用程序可能会继续在未来的版本上运行。我猜 iOS 之所以如此不同,是因为硬件的变化往往足以使旧的应用程序无论如何都无法运行。
  • @DavidH 同意。实际上,Id be surprised if presentModalViewController` 很快就会消失。但它可能在未来的某个日期变得不可用这一事实似乎正是“已弃用”的定义。我假设您并不是建议人们继续使用已弃用的方法,因为这似乎与良好的防御性编程技术背道而驰。
  • 更新 Xcode 时遇到的最严重的问题是您的代码不再编译。它真的不太可能在 iOS7 中停止工作。在ios8中,是的,我会担心。通过 iOS9 我会非常担心:-)。但是我对“已弃用”的阅读意味着您无法再编译您的代码 - 旧二进制文件是否运行的问题是完全不同的问题,而且我还没有看到完全解释过的问题。同样,2002 年的一些 OSX 二进制文件仍然可以在我的 Mac 上运行。
  • 根据 Apple 的说法,“一种被确定为已弃用的方法已被取代,将来可能会不受支持。”我同意,在实践中,您可以暂时摆脱它,但我绝不会建议人们在弃用方法后继续使用它们(除非像我在回答中概述的那样完成)。继续使用已弃用的方法并不是好的防御性编程。在我看来,我们应该尽我们所能轻松地“面向未来”我们的应用程序。我想我们必须同意不同意这一点。 :)
  • 让我提出一个中间立场。 API 不允许您在版本 X 中使用该 API。由于实际系统接口被删除,您当前在商店中的应用程序崩溃的版本是 Y。我断言 Y > X,而不是 Y >= X。通常它的 Y >> X。绝不是 Y = X。
【解决方案2】:

如果您想使用已弃用的方法来支持旧版本,只需检查对象是否响应新方法即可。如果没有,您使用的是旧版本,需要使用旧方法。

if ([myVC respondsToSelector:@selector(presentViewController:animated:completion:)]) {
   //use the new version
} else {
   //use the old version.
}

【讨论】:

  • +1 我同意。使用respondsToSelector 来检查方法的可用性(并使用NSClassFromString 来检查弱链接类)是执行给定方法和类的运行时可用性的更好方法。我已经相应地更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2017-06-04
  • 2021-10-10
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多