背景:
假设我正在使用 iOS 6 SDK 开发应用程序。我将部署目标设置为 iOS 5。然后我可以使用 6 中的功能,但为了保持与 5 的兼容性,您必须在代码中进行一些检查:
// method only available from 6, class of someObj existed in 5
if (someObj respondToSelector:@selector(aMethod)) {
[someObj aMethod];
}
或者
// entire class only available from 6
if (NSStringFromClass([SKStoreProductViewController class]) != nil) {
SKStoreProductViewController *store = [[SKStoreProductViewController alloc] init];
}
到目前为止,一切都很好。据我所知,这些是做事的标准方式。
但是我今天发现,对于新类示例,如果我只是尝试分配/初始化该类中的一个对象而不进行任何检查,它不会在 iOS 5 上崩溃,这是我所期望的,而是返回 null。
// run this on an iOS 5 device
NSLog(@"%@", [UICollectionView alloc] init]);
为什么这不会导致 iOS 5 崩溃?我想这与链接器的工作方式有关,但我预计会崩溃,因为该版本中不存在该符号。
第二个问题是:如果正常测试是使用 NSStringFromClass 方法,这意味着您可以将 +class 方法发送到不存在的类,它将返回 null - 为什么/如何工作?
最后,我注意到我可以创建一个 ViewController,它采用仅在 iOS 6 中定义的协议,并且在 5 上也不会导致任何问题。 ?