如果SDK添加了新功能,这些功能是否适用于较旧的设备?如果API获取新方法,编译器是否处理这些新方法以获取某些内部本机代码,或者添加的新功能是否无法在未运行新操作系统的设备上使用?
答案 0 :(得分:5)
当Apple添加新的SDK功能时,它们几乎总是依赖于同时添加到操作系统并在早期迭代中不可用的新框架或运行时功能。很少有例外,但它们总是与添加到编译器的SDK功能有关。例如,根据iOS 5 SDK中有关自动引用计数的披露信息,假设您将能够使用除自动归零弱指针之外的所有ARC功能构建iOS 4应用程序是合理的,因为这需要一些运行时支持。虽然我们不会确定苹果打算提供它们的工具来自NDA。
Apple希望您使用Objective-C运行时的动态特性,仅在新功能可用时使用新功能,并将基本部署目标设置为应用程序运行的操作系统的最低支持版本。在合理的范围内。
例如:
if(![someObject respondsToSelector:@selector(relevantNewMethod)])
{
// this version of the OS doesn't actually have relevantNewMethod
// so we'll do something else instead; attempting to use it will
// raise an exception on this device
}
或者:
if(NSClassFromString(@"ShinyNewiOSClass"))
{
// ShinyNewiOSClass is implemented on this version of the OS, so
// we can use it. Otherwise we'd better find something else to do
// instead...
}
如果不存在具有该名称的类, NSClassFromString
将返回Class
实例或nil
,因此您可以取代NSClassFromString的结果并在其上执行习惯的alloc init偏爱。
一个典型的例子是,只有MFMailComposer
可用时才会显示“电子邮件”按钮(如果您希望在使用iOS 3方法时支持iOS 2)。
对于全新的框架,标准做法是弱链接(这意味着你的程序希望它们被加载,但操作系统不应该提出例外,如果它们不存在)然后使用相同的反射功能来检查如果相关类在运行时可用。
答案 1 :(得分:3)
据我了解,SDK更新通常与操作系统更新一致。因此,添加到SDK的任何功能仅在支持该SDK的操作系统版本中可用。
我将给出一个基于Android的示例,但我相信它背后的过程与iOS相同:
Android 2.1 == SDK v7(API级别7)
Android 2.2 == SDK v8(API级别8)
从SDK v8开始提供的所有功能都不适用于运行Android 2.1或更早版本的手机。
答案 2 :(得分:2)
SDK附带特定的iOS版本。适用于iOS 5.0的SDK为使用它编译的应用程序提供了5.0功能(以及所有旧功能或API)的接口。 5.0中的新功能只能在安装了5.0的设备上使用。应用程序可以检测它是否在具有该功能的设备上运行,如果设备没有支持该功能的iOS版本,则可以避免使用该功能。如果某个应用程序在安装了iOS 3.1.3的设备上运行时尝试使用4.0功能(例如),该应用程序将获得异常并崩溃。
某些设备(如原始iPhone)无法加载最新的iOS版本。最初的iPhone卡在3.1.3。 iPhone 3G获得了4.X但它的一些功能被禁用(如多任务处理)。这个wikipedia article对于各种设备可以运行的最大iOS版本非常有用。
答案 3 :(得分:0)
在大多数情况下,为了保持向后兼容性,SDK中添加的新功能是“选择加入”,并且需要您利用它们发布应用程序的新版本。规则总是有例外,但通常就是这种情况。
答案 4 :(得分:0)
我最初读错了这个问题......
如果问题是......如果我为iOS5功能编程,那么iOS 4上是否支持该功能?
然后答案是......不。
除非您执行类似Tommy提到的防御措施之类的操作,否则您的应用程序将根本无法编译,或者在访问这些功能时会崩溃。