为什么iOS SDK和iOS操作系统版本互相影响? 或者:什么是iOS SDK?

编辑:

下面的H2CO3答案让我快乐。 但是它并没有解释一件事情:为什么在构build应用程序对SDK6(UIPageViewController需要一个子控制器,然后将其添加到父控制器中)之前得到一个运行时exception,而不是构build对SDK5时? Rolf的答案解释了发生了什么事情:设备知道应用程序所构build的SDK,其行为有所不同,以确保最大的兼容性。

在与iOS SDK版本,MonoTouch版本和不同的iOS版本战斗时,我开始想知道: 什么是iOS SDK

我的意思是,我安装Xcode 4.4,我得到iOS SDK 5.如果我安装Xcode 4.5,我得到的iOS SDK 6.到目前为止没有问题。

  • 现在假设我构build了一个targets iOS 5的应用程序,并且不not use any iOS 6 specific东西。 我只是using iOS SDK 6构build这个应用程序。
  • 然后我构buildsame app但使用iOS SDK 5

然后我在iOS 6设备上运行这两个版本的应用程序。

为什么他们的行为有所不同? 有一些小的差异,例如,如果在将页面视图控制器作为子控件添加到父控制器之前未设置子控制器,则UIPageViewController会引发exception。

据我了解,callback,function和一切都来自iOS操作系统,而不是从SDK。 但是两种情况下的操作系统是一样的。

我完全理解,如果我想要使用iOS 6特定function,则需要使用iOS SDK 6,因为SDK 5中不存在UICollectionView。但是,此视图的UI代码显然未包含在我的应用程序中,否则它也可以在iOS5上运行。 所以收集视图来自操作系统提供的共享库。

最重要的是MonoTouch。 如果我们假设每个MonoTouch版本只是绑定的扩展而没有修复任何错误,那么应该使用什么MT版本。

我的问题的简短回顾将是:如何iOS版本,iOS SDK版本,MonoTouch版本和应用程序的目标版本一起玩?

从理论上讲,你应该能够从iOS 5切换到iOS 6 SDK,而不会看到任何差异。 在实践中,它有点不同。

  1. 该设备知道您使用的SDK。 这意味着设备本身可以决定行为不同(无论出于何种原因苹果认为这是一个好主意)。
  2. 你正在使用一个不同的工具链(gcc和相关的二进制文件),他们可能编译的东西不同(这是罕见的,但我没有看到它实际发生)。
  3. MonoTouch本身可能会有不同的performance(现在没有什么可以想到的,但是例如我们可以使用不同的默认值,比如部署目标(如果你自己没有设置的话))。

我相信你已经遇到了第一种情况 – 苹果已经在iOS6中添加了一些限制到他们的UI层次中,只有当你针对iOS 6 SDK构build时才会执行这些限制(为了不破坏现有的应用程序)。

iOS SDK包含两个组件:工具链(Clang和/或GCC作为编译器,ld(64)作为链接器和cctools包(GNU人称之为binutils )的其他部分以及库和头文件。

工具链(编译器)版本与iOS的版本号并不严格相关。 理论上,任何足够的交叉编译器都可以为任何iOS构build代码(尽pipe在实践中,由于Appledevise编译器时出现的错误(包括硬编码的库函数名称,类和方法select器等) )。

头文件和库(包括Apple特定的“框架”types的库)基本上是iOS上的/usr/include/usr/lib/System/Library/Frameworks目录的副本。 (即使这不完全正确 – 在iOS上,由于引入了dyld共享caching ,因此iOS 3和iOS 3.1的库中不存在头文件。 他们基本上告诉编译器和链接器哪些function,类和方法可用于特定版本的iOS。 头文件用于编译时validation,库用于连接时间validation。 基本上,在一个普通的非embedded式系统(即在桌面上),不需要交叉编译代码的情况下,“SDK”基本上是指操作系统本身中的相同文件,而不是被称为“SDK”; 它宁可被称为“系统”。