クラスを使用する前に存在するかどうかを確認するために、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");
期待どおり、それはうまくいきます。
クラスが存在することを確認するために醜いものを使用して問題を回避することができましたNSClassFromString()
が、他のアプローチが機能しない理由を知りたいです。