Objective-Cクラス->次のような文字列:[NSArray className]-> @“ NSArray”


128

クラスオブジェクト自体からクラスの文字列名を取得しようとしています。

// For instance
[NSArray className]; // @"NSArray"

私は見つけましたobject_getClassName(id obj)が、それにインスタンスを渡す必要があります。私の場合、それは不必要な作業です。

では、インスタンスではなくクラスオブジェクトから文字列を取得するにはどうすればよいでしょうか。

回答:


305
NSString *name = NSStringFromClass ([NSArray class]);

あなたは逆に戻ることさえできます:

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];

ありがとう!どのようにNSStringFromClass実装されていますか?static NSString変数にクラス名を格納する方がパフォーマンスが良いですか?
ma11hew28

13
@MattDiPasquale:すべてのクラス名はObjective-Cランタイムのどこかに格納されます(ランタイムの内部はほとんどアプリケーションから隠されており、いくつかのAPI関数によってのみ公開されます)。各クラスオブジェクト(たとえば[NSArray class])は実際にはstructです。にstructは、クラスの名前、実装するメソッド、スーパークラスなど、クラスに関する多くの情報が含まれています。これからクラスNSStringFromClassの名前を取り出し、structそれをに変換しNSStringます。クラス名をに保存しないでくださいstatic NSString。パフォーマンスが向上することはありません。
dreamlax 2011

3
@MattDiPasquale:NSClassFromString動作が少し異なります。すべてのクラス名はObjective-Cランタイムのどこかに存在するためNSClassFromString、文字列を取得し、ランタイムによって維持されているクラスのリストを調べて、指定された名前のクラスを探します。見つかった場合はそれを返し、見つからなかった場合はを返しますNil
dreamlax 2011

2
@MattDiPasquale: "NSStringFromClassはどのように実装されていますか?" 本当に知りたい場合は、おそらくclass_getName()ランタイムで使用し、C文字列を返します
user102008

2
@AlexZavatone:classNameスクリプト拡張機能によって追加されたメソッドで、Mac OS Xでのみ利用できます。完全に文書化されていないため、または少なくとも最後に確認したわけではないため、動作に細心の注意が必要です。NSStringFromClass()それについて行く正しい方法です。
dreamlax

1

タイピングを少し減らして別の方法で実行します。

NSString *name = [NSArray description];

7
これは、要求された動作を保証するものではありません。このメソッドは通常、オブジェクトとオブジェクトに含まれるデータの説明を提供するためにオーバーライドされます。
アレックスウェイン

3
INSTANCEメソッドとしてオーバーライドされていることはわかっていますが、+ description CLASS METHODはどのくらいの頻度でオーバーライドされますか?いずれにせよ、すべてのクラスについてではないにしても、検討する価値があります...ダウングレードが必要だったとは思いません。
シャーウィンザデー

1
@SherwinZadeh:実際には、オーバーライドされたクラスを見つける可能性は低いと思いますが+description、理論的には、これはの目的ではないため+description、このメソッドはクラス名を決定するのに脆弱です。
dreamlax

1

この代替案を検討してください:

const char *name = class_getName(cls);

NSStringオブジェクトを割り当てたり、ASCIIを任意のNSString表現に変換したりする必要がないため、はるかに高速です。これNSStringFromClass()が実装方法です。


これは私にとっては便利でしたが、ファイルの先頭に#import <objc / runtime.h>を追加する必要がありました。
Sparklellama
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.