4

编辑:

下面来自 H2CO3 的答案让我几乎很高兴。但这并没有解释一件事:为什么在针对 SDK6 构建应用程序时会出现运行时异常(UIPageViewController 在将其添加到父控制器之前需要一个子控制器),但在针对 SDK5 构建应用程序时却没有?Rolf 的回答解释了发生了什么:设备知道构建应用程序所使用的 SDK,并且行为不同以确保最大的兼容性。

在与 iOS SDK 版本、MonoTouch 版本和不同的 iOS 版本作斗争时,我开始想:到底什么是 iOS SDK

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

  • 现在假设我构建了一个应用程序targets iOS 5并做not use any iOS 6 specific一些事情。我只是构建这个应用程序using iOS SDK 6
  • 然后我建立same app但使用iOS SDK 5.

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

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

据我了解,回调、功能和一切都来自 iOS 操作系统,而不是来自 SDK。但操作系统在这两种情况下都是相同的。

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

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

我的问题的简短回顾是:iOS 版本、iOS SDK 版本、MonoTouch 版本和应用程序的目标版本如何协同工作?

4

2 回答 2

5

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

工具链(编译器)版本与 iOS 的版本号没有严格的关系。理论上,任何足够的交叉编译器都可以为任何 iOS 构建代码(尽管在实践中,由于 Apple 在设计编译器时所犯的错误,包括硬编码的库函数名称、类和方法选择器等,存在例外和限制.)。

头文件和库(包括 Apple 特定的“框架”类型的库)本质上是 iOS 上/usr/include,/usr/lib和目录的副本。/System/Library/Frameworks(即使这也不完全正确 - 在 iOS 上,iOS 3 和 iOS 3.1 中的库不存在头文件,因为引入了dyld 共享缓存)。它们基本上告诉编译器和链接器哪些函数、类和方法可用于特定版本的 iOS。头文件用于编译时验证,库用于链接时验证。基本上,在不需要交叉编译代码的普通非嵌入式系统(即桌面)上,“SDK”基本上意味着操作系统本身中的相同文件,并且它不会被称为“SDK”;它宁愿被称为“sysroot”。

于 2012-10-29T09:34:25.573 回答
2

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

  1. 设备知道您使用的 SDK。这意味着设备本身可以决定采取不同的行为(无论出于何种原因,Apple 认为这是一个好主意)。
  2. 您使用的是不同的工具链(gcc 和相关的二进制文件),它们可能会以不同的方式编译东西(尽管这种情况很少见,我还没有看到它实际发生过)。
  3. MonoTouch 本身的行为可能有所不同(现在什么都没有想到,但例如我们可能会为诸如部署目标之类的东西使用不同的默认值(当然,如果您自己没有设置))。

我相信您遇到了第一种情况 - Apple 在 iOS6 中为其 UI 层次结构添加了一些限制,它们仅在您针对 iOS 6 SDK 构建时才会强制执行(我认为不会破坏现有应用程序)。

于 2012-10-29T12:08:14.567 回答