我正在嘗試使用this approach, described by Marco Arment, for checking if a class exists before using it。使用正確的設置,類會在適當時自動弱連接。正如Marco所描述的那樣,「你可以安全地繼承子類或者指向你想要的任何東西(只要你注意在它們不可用時不要實例化它們)」。爲什麼在iOS 4.2.1上檢查[NSMetadataQuery class]崩潰?
我的應用程序運行正常在iOS 5.我已經按照在鏈接中提到的條件:(iOS版5.1)
- 基地SDK是最新的iOS
- 部署目標是iOS的4.0
- 編譯對於C/C++/Objective-C的是蘋果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");
正常工作正常,如預期。
我已經能夠使用醜陋的NSClassFromString()
解決問題,以確保類存在,但我很想知道爲什麼其他方法不起作用。
正如[在我鏈接的文章](http://www.marco.org/2010/11/22/supporting-older-versions-of-ios-while-using-new-apis)所解釋的那樣, iOS 4.2 SDK及更高版本中的一項功能,可自動弱鏈接需要它的類。我還舉了一個示例,說明此功能的正確工作方式--UIDictationPhrase類僅在iOS 5.1及更高版本中可用。 – robotspacer