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

Kru*_*lur 4 sdk objective-c xamarin.ios ios

编辑:

以下来自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,因为SDK 5中不存在UICollectionView.但是此视图的UI代码显然没有包含在我的应用中,否则它也适用于iOS5.因此,集合视图来自操作系统提供的共享库.

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

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

小智 5

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

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

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