2012-05-30 32 views
1

我正在嘗試使用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()解決問題,以確保類存在,但我很想知道爲什麼其他方法不起作用。

回答

1

我對此沒有解釋,但我遇到了同樣的問題。不管是什麼我/你做什麼,只是NSMetadataQuery不會是弱鏈接...

參考這個答案,這真是一個問題最好的一個:

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

總之,其他自動弱鏈接似乎工作,這只是NSMetadataQuery*,你必須從源代碼中刪除並取代id。使用NSClassFromString()等實例化該類。但是,其他類如UIDocument沒有打嗝,所以您可以安全地以普通的無汗方式使用這些類。

-1

NSMetadataQuery在iOS 5.0及以上的版本可以,因此低於這一點的任何版本都無法確定它在做什麼。通過僅在代碼中使用它,類名將被添加到符號表中並在應用程序啓動時查找。

+0

正如[在我鏈接的文章](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