web-dev-qa-db-ja.com

NSClassFromStringはnilを返します

NSClassFromStringnilを返すのはなぜですか?定義に従って、クラス名を返す必要があります。この問題を修正するにはどうすればよいですか?文字列からクラスをインスタンス化し、作成されたインスタンスを使用して、クラス内にあるメソッドを呼び出す必要があります。

これは私のコードがどのように見えるかです:

id myclass = [[NSClassFromString(@"Class_from_String") alloc] init];
[myclass method_from_class];

しかし method_from_class関数が呼び出されておらず、制御が実行されていません。そして私のコードはエラーがありません。 Objective-Cでこれを解決する方法はありますか?

18
suse

関数のドキュメントによると

戻り値aClassNameで指定されたクラスオブジェクト、またはその名前のクラスが現在ロードされていない場合はnil。 aClassNameがnilの場合、nilを返します。

これを適切に使用する方法の例は次のとおりです。

Class dictionaryClass = NSClassFromString(@"NSMutableDictionary");
id object = [[dictionaryClass alloc] init];
[object setObject:@"Foo" forKey:@"Bar"];
30
Dave DeLong

静的ライブラリからクラスをインスタンス化しようとしている場合は、「-ObjC」フラグを「OtherLinkerFlags」ビルド設定に追加する必要があります。

38
m.kocikowski

これがクラスへの唯一の参照である場合、クラスがリンクされていない可能性があります。

さまざまなタイプのサブクラスをインスタンス化するファクトリメソッドがありました。ファクトリには、適切なサブクラスに移動し、それを割り当てて初期化するswitchステートメントがありました。クラスの名前を除いて、すべてのalloc/initステートメントがまったく同じであることに気づきました。そのため、NSClassFromString()関数を使用してスイッチブロック全体を削除することができました。

私は同じ問題に遭遇しました-リターンはゼロでした。これは、クラスがプログラムの他の場所で使用されていなかったため、リンクされていなかったため、実行時に見つからなかったためです。

次のステートメントを含めることで、これを解決できます。

[MyClass class];

それは私が達成しようとしていたことの目的全体を打ち負かします、しかしそれはあなたが必要とするすべてであるかもしれません。

4
Al Smith

これは、Xcodeプロジェクトに外部ファイルを追加したときに発生しました。 .mファイルをビルドフェーズ> ソースのコンパイルに追加すると、問題が解決します。

4
Quang Vĩnh Hà

また、インスタンス化しようとしているクラスがプロジェクトに含まれていることを確認する必要があります。後で追加した場合は、作成するターゲットの横にあるチェックボックスをクリックする必要があります。

2
Boojie Waldron

これらすべての呼び出しを分解してみませんか?このようにして、呼び出し間の値を確認できます。

Class myclass = NSClassFromString(@"Class_from_String");
id obj = [[myclass alloc] init];
[obj method_from_class];

ちなみに、method_from_classはインスタンスメソッドですか、それともクラスメソッドですか?後者の場合は、myclass値でmethod_from_classを直接呼び出すことができます。

[myclass method_from_class];
1

また、Appleによってサポートされている標準のシングルトンコードを追加すると、クラスが読み込まれなくなりました。コードは期待どおりに機能していたので、シングルトンを追加すると、突然NSClassFromStringがnilを返し始めました。 。シングルトンコードをコメントアウトすると、NSClassFromStringがクラスを正しく解決しました。相互作用はわかりませんが、シングルトン静的変数がどういうわけか壊れてクラス名を非表示にしたと思います...?

0