1

クラスを使用する前に存在するかどうかを確認するために、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()が、他のアプローチが機能しない理由を知りたいです。

4

2 に答える 2

1

これについての説明はありませんが、あなたと同じ問題に遭遇しました。私/あなたが何をしても、NSMetadataQuery は弱いリンクにはなりません...

この回答を参照してください。これは、別の質問で実際に最良の回答です。

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

要するに、他の自動弱いリンクが機能しているようNSMetadataQuery*です。ソースから削除してid. NSClassFromString()クラスをetcでインスタンス化します。UIDocumentただし、他のクラスのような問題は発生しないため、通常の汗をかかずに安全に使用できます。

于 2012-07-07T05:59:43.923 に答える
-1

NSMetadataQueryは iOS 5.0 以降で利用できるので、それ以下のバージョンではそれが何であるかはわかりません。コードで使用するだけで、クラス名がシンボル テーブルに追加され、アプリの起動時に参照されます。

于 2012-05-30T07:40:09.707 に答える