编写支持iOS 3.1.3和iOS 4.x的iOS应用程序时的陷阱

我想写一个可以在iOS 3.1.3到iOS 4.1上运行的应用程序。 我知道如何设置部署目标和基本SDK。

在阅读Apple文档之后,它严重依赖于检查类是否可用和/或实例是否响应特定选择器。

现在我的问题:

  1. 如果Apple在3.1.3到4.x上公开课,会发生什么? 当只检查类名时,它也可以在iOS 3.1.3上使用吗? 所以在这个版本上我将使用私有API,我不想要。 你会怎么检查? 这真的是一个问题,还是我担心太多?
  2. 您还会使用由iOS版本定义的预处理程序符号吗?
  3. 我应该选择armv6或armv7的架构? 我认为armv6也可以在armv7上运行,这是正确的吗?
  4. 如果我在我的代码中使用iOS 3.1.3中没有的东西,我可以从编译器获得任何帮助吗? 它会被检查吗?
  5. 我应该知道哪些突出的陷阱?

我已经看过WWDC10的会议130“面向未来的应用程序”,所以事情已经知道了。

谢谢。

根据个人经验,可能没有正确的答案,但我会尝试:

  1. 我不认为这是一个问题,因为私人API禁令背后的原因。 Apple禁止私有API(至少部分),因为他们不希望在未来版本的iOS中幕后更改,因为它现在是公共API,它保证得到支持。

  2. 没有线索。 我已经看到它们用于可以在OSX和iOS上运行的代码。但我不认为我会这样,因为在运行时检测到iOS版本并且编译实际上只能考虑OS X vs iOS,而不是3.x vs 4 。X。

  3. 使用armv6,以便您可以支持较旧的iOS设备。 armv7不会有问题。 我相信你是对的,armv7可以运行为armv6构建的应用程序,但我不确定。

  4. 这取决于您的目标部署平台 。 如果您调用已弃用的代码,则会收到警告。

  5. 大概。 我遇到过iAd的问题,但我不记得具体细节。 只需检查现有的类,并记住在必要时进行弱连接和类实例化。

有一点需要注意:您不能使用预处理符号,因为它们在编译时被解析。 因此,如果您针对3.1.3框架编译应用程序,则无法使用4.0框架,即使在运行4.0(或4.1,当前)的设备上也是如此。 就个人而言,我通过制作两个目标来解决这个问题

在(3)孤立:没有必要选择,只需生成一个包含ARM6和ARM7代码的胖二进制文件,这是默认行为。 是否使用thumb指令取决于程序在大多数情况下执行的操作 – ARMv6 Thumb不包含浮点运算,因此浮点数运算需要相当大的成本。 相反,如果你根本不做很多浮点数学运算,那么保持拇指模式开启并节省内存带宽和缓存大小要聪明得多。 ARMv7 Thumb包含浮点运算。

在您的项目中:查看“架构”设置。 它可能是’标准(arm6 arm7)’,它将产生脂肪二进制。

要为每个架构设置Thumb模式(或任何其他设置),请在Target Info窗口中选择它,单击左下方的小齿轮,然后选择“Add Build Setting Condition”。 然后,您可以为SDK和体系结构的特定组合设置适用于该设置的值。 因此,如果您要按目标CPU系列进行区分,那么您希望两次执行此操作,为“任意SDK”添加一个值为“ARMv6”,为“任何SDK”添加一个值为“ARMv7”。