问题:
在最新的SDK上进行开发,但是你希望对运行旧版本的设备也支持.
程序必须不断检查实例或类方法是否存在,否则程序会是脆弱的,因为部署的装置的 SDK 版本,不一定是最新的,也许方法会不存在。
讨论:
有两个关于iOS SDK的概念:
Base SDK(基底SDK):这个 SDK 是用来编译应用程序。可能是最新最大的 SDK,且能存取所有新的 API
Deployment SDK/Target(部署SDK):是指定你希望编译后并执行的装置SDK 版本。
方案:
使用 NSObject 的 instancesRespondToSelector:类方法检测指定的 selector 是否存在类实例中。
要确认一个类是否响应本身的类方法,需使用 respondsToSelector:类方法。
你可以使用同样方式检测在一个实例的实例方法
例子:
//2.1在这个例子中,我们正在检查存在的具体实例方法,使用 instancesRespondToSelector:NSMutableArray 类(这 NSArray 的子类)的类的方法。另外, 我们可以使用数组实例方法 respondsToSelector: NSMutableArray *array1 = [[NSMutableArray alloc]initWithObjects: @"Item 1", @"Item 4", @"Item 3", @"Item 2", @"Item 5",nil]; NSLog(@"Array = %@",array1); if ([NSArray instancesRespondToSelector:@selector(sortUsingComparator:)]) { //用sortUsingComparator:方法对array1排序 } else if ([NSArray instancesRespondToSelector:@selector(sortUsingFunction:context:)]){ }else{ //do something else } if ([array1 respondsToSelector:@selector(sortUsingFunction:context:)]) { NSLog(@"1"); }else if ([array1 respondsToSelector:@selector(sortUsingComparator:)]){ NSLog(@"2"); }