NSClassFromString
は、指定されたクラスのランタイムを検索します。クラスが存在するかどうかは事実上決定される。
コンパイラが[SomeClass someMethod]
のような過去の静的リファレンスを正常に取得するには、リンクする対象が必要です。
あなたは、FoundationとAppleのようなものにリンクするときにメカニズムが動作することは間違いありません。つまり、NSJSONSerialization
が存在するかどうかのチェックのように、余分なクラスが追加されます。
フレームワークとのリンクが弱い場合や、存在しない場合もあります。だからTwitter.frameworkとの弱いリンクがあり、[TWRequest alloc] ...
を使用することができます。 Twitterフレームワークがない場所でも、iOS 4を構築して展開することはできます。
アップルは実際にライブラリが保存されている方法を若干変更して、弱いリンクがあるNSClassFromString
の代わりにif([TWRequest class])
などを使用できるように移行しています。
しかし、静的ライブラリにリンクするか、リンクしないように思えますか?したがって、クラスは実行時に利用可能である場合と利用できない場合がありますが、リンカに表示される場合と表示されない場合があります。
その場合、メタクラスへのリテラル参照を避けるだけで済みます。限りヘッダファイルは(つまり、とにかくバイナリに入らないため)となりますコンパイラはあなたが、ポインタのためにSomeClass
タイプを指定できるように幸せになります表示されているよう
Class someClassMetaClass = NSClassFromString(@"SomeClass");
if(someClassMetaClass)
{
SomeClass *instance = [[someClassMetaClass alloc] init];
/* ... */
}
:だからあなたのような何かを行うことができます公開されたインターフェースに対して通常の自動補完と警告を提案することができます。ランタイムから直接取得するのではなく、Class
へのポインタを使用して常にメタクラスのアドレスを指定するようにしてください。そうすれば、リンカーがフォローアップする必要はありません。
ありがとうございました。私はライトバージョンからいくつかのクラスが欠けている "フル"と "ライト"のバリアントを持つライブラリを構築しています。他のいくつかのクラスの動作は、それらが存在するかどうかに依存します。 – Gruntcakes