Cocoa touch 为什么在iOS 4.2.1上检查[NSMetadataQuery类]会崩溃?
我正在尝试使用。有了正确的设置,类在适当的时候会自动弱链接。正如Marco所描述的,“您可以安全地创建子类或拥有指向您想要的任何对象的指针(只要您小心不要在它们不可用时实例化它们)” 我的应用程序在iOS 5上运行良好。我遵循了链接中提到的条件:Cocoa touch 为什么在iOS 4.2.1上检查[NSMetadataQuery类]会崩溃?,cocoa-touch,ios4,nsmetadataquery,Cocoa Touch,Ios4,Nsmetadataquery,我正在尝试使用。有了正确的设置,类在适当的时候会自动弱链接。正如Marco所描述的,“您可以安全地创建子类或拥有指向您想要的任何对象的指针(只要您小心不要在它们不可用时实例化它们)” 我的应用程序在iOS 5上运行良好。我遵循了链接中提到的条件: 基本SDK是最新的iOS(iOS 5.1) 部署目标是iOS 4.0 C/C++/Objective-C的编译器是Apple LLVM编译器3.1(也尝试了LLVM GCC 4.2) 每当我引用NSMetadataQuery时,我都会首先确保该类存
- 基本SDK是最新的iOS(iOS 5.1)
- 部署目标是iOS 4.0
- C/C++/Objective-C的编译器是Apple LLVM编译器3.1(也尝试了LLVM GCC 4.2)
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");
正如预期的那样,效果很好
我已经能够使用更丑的
NSClassFromString()
来解决这个问题,以确保该类存在,但我很想知道为什么另一种方法不起作用。NSMetadataQuery
在iOS 5.0及更高版本中可用,因此下面的任何版本都不知道它是什么。只需在代码中使用它,类名就会添加到符号表中,并在应用程序启动时进行查找。对此我没有解释,但我遇到了与您相同的问题。无论我/你做什么,NSMetadataQuery都不会弱链接
请参考这个答案,这是另一个问题中最好的答案:
简言之,其他自动弱链接似乎也能起作用,只是NSMetadataQuery*
必须从源代码中删除并替换为id
。使用NSClassFromString()
等实例化该类。其他类(如UIDocument
等)不会出现问题,因此您可以安全地以正常无汗的方式使用这些类。如前所述,iOS 4.2 SDK和更高版本中有一个功能,可以自动将需要它的类弱链接起来。我还举了一个例子来说明此功能在哪里正确工作UIDictionPhase类仅在iOS 5.1及更高版本中可用。