我正在尝试使用Marco Arment 描述的这种方法,在使用它之前检查一个类是否存在。使用正确的设置,类会在适当的时候自动弱链接。正如 Marco 所描述的,“您可以安全地继承子类或拥有指向您想要的任何东西的指针(只要您小心不要在它们不可用时实例化它们)”。
我的应用在 iOS 5 上运行良好。我遵循了链接中提到的条件:
- 基础 SDK 是最新的 iOS (iOS 5.1)
- 部署目标是 iOS 4.0
- C/C++/Objective-C 的编译器是 Apple LLVM 编译器 3.1(也尝试过 LLVM GCC 4.2)
每当我引用 NSMetadataQuery 时,我都会确保该类首先存在:
if ([NSMetadataQuery class] != nil) …
尽管如此,如果我尝试在装有 iOS 4.2.1 的 iPod touch 上运行我的应用程序,它会在启动时立即崩溃:
dyld: Symbol not found: _OBJC_CLASS_$_NSMetadataQuery
我已经尝试注释掉我的应用程序运行正常的所有代码。一旦我添加回对 NSMetadataQuery 的单个引用,它就会崩溃。我什至试过这个:
if ([NSMetadataQuery class] != nil) NSLog(@"OK");
简单地包括该行,并且没有对 NSMetadataQuery 的其他引用,会使应用程序崩溃。更奇怪的是,检查其他 iOS 5 类不会导致任何问题:
if ([UIDictationPhrase class] != nil) NSLog(@"OK");
正如预期的那样,效果很好。
我已经能够使用 uglier 解决该问题NSClassFromString()
以确保该类存在,但我很想知道为什么其他方法不起作用。