1

我正在尝试使用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()以确保该类存在,但我很想知道为什么其他方法不起作用。

4

2 回答 2

1

我对此没有任何解释,但我遇到了和你一样的问题。无论我/你做什么,NSMetadataQuery 都不会被弱链接......

参考这个答案,这确实是另一个问题中最好的答案:

https://stackoverflow.com/a/8426591/129202

简而言之,其他自动弱链接似乎有效,只是NSMetadataQuery*您必须从源代码中删除并替换为id. 用 etc 实例化该类。但是NSClassFromString(),其他类不会出现问题,UIDocument因此您可以以正常的无汗方式安全地使用它们。

于 2012-07-07T05:59:43.923 回答
-1

NSMetadataQuery在 iOS 5.0 及更高版本中可用,因此任何低于该版本的版本都不知道它是什么。通过仅在代码中使用它,类名将被添加到符号表中,并在应用程序启动时进行查找。

于 2012-05-30T07:40:09.707 回答