Ipad 国际监督组织:“国际监督组织”;“未找到符号”;在某些iOS4设备上出错,但不是所有设备

Ipad 国际监督组织:“国际监督组织”;“未找到符号”;在某些iOS4设备上出错,但不是所有设备,ipad,ios4,dyld,nsmetadataquery,Ipad,Ios4,Dyld,Nsmetadataquery,我在用户的崩溃日志中收到以下消息: Dyld错误消息:未找到符号:_OBJC_CLASS_$\n NSMetadataQuery 所以我理解的是,我应该让基础框架“可选”。但让我感到奇怪的是,这种崩溃只发生在一些iOS4设备上,而不是其他设备上,而且在4.3模拟器中也不会崩溃。这只发生在iPad(运行iOS4)上,但即便如此,也只发生在其中一些iPad上。有人能解释为什么会这样吗 如果是链接框架的错误,那么它应该会在所有iOS4设备(或者至少是所有iPad)上崩溃,对吗?NSMetadataQu

我在用户的崩溃日志中收到以下消息:

Dyld错误消息:未找到符号:_OBJC_CLASS_$\n NSMetadataQuery

所以我理解的是,我应该让基础框架“可选”。但让我感到奇怪的是,这种崩溃只发生在一些iOS4设备上,而不是其他设备上,而且在4.3模拟器中也不会崩溃。这只发生在iPad(运行iOS4)上,但即便如此,也只发生在其中一些iPad上。有人能解释为什么会这样吗


如果是链接框架的错误,那么它应该会在所有iOS4设备(或者至少是所有iPad)上崩溃,对吗?

NSMetadataQuery在iOS>=5.0上可用,我假设您知道这一点,因为您谈论的是弱链接框架

首先

因为这是在运行时发生的,并且不可重复,所以听起来您的逻辑不一致。在没有首先确保类存在的情况下,是否在任何地方使用NSMetadataQuery?您的代码应该用以下习惯用法包装:

if ([NSMetadataQuery class] != nil) {
    // Use the class
}

我确实犯了这个错误。这不是逻辑问题,因为它甚至在调用App委托之前就崩溃了,而且我对
NSMetadataQuery
的使用在生命周期中要晚得多


证明了弱链接基础框架是必需的。

我做了两件事:在AppDe委托中声明一个NSMITADATAQUIORY对象(未使用)作为IVAR。另外,使用以下命令检查iOS4:BOOL isIOS4=([[NSFileManager defaultManager]respondsToSelector:@selector(urlforubiquitycontainerinidentifier:))))?假:真;好的,这并不是您想要在运行时测试可用性的方式;使用我上面描述的机制(并在提供的链接中详细说明)。我对ivar更感兴趣。。。它是否位于仅在iOS 5中选择性加载的类上?检查“respondsToSelector”是否比检查类可用性更糟糕?我认为ivar的事情是一个转移注意力的问题;我用它测试了一些东西,它被卸载了,即使在iOS5中也是如此。但是ivar已经在那里生产了几个版本,没有出现任何问题。选择器检查的响应是新的。