クラスインスタンスの種類を判定する : Objective-C プログラミング

PROGRAM


クラスインスタンスの種類を判定する

Objective-C では、変数に格納されたクラスインスタンスの種類を調べることができるようになっています。

クラス名を文字列で取得する

たとえば、id 型の変数 obj に格納されているクラスの名称を、次のように "NSStringFromClass" 関数を使用して、NSString* 型の文字列で取得することができます。

// クラス名を文字列で取得できます。

NSString* className = NSStringFromClass([obj class]);

このようにすることで、変数に格納されているクラス名を NSString 型の文字列として、取得することができます。

 

ここで注意点したいのが、NSString のようなクラスクラスタの場合には、実際に生成されているインスタンスのクラス名が取得できるようです。

たとえば NSString クラスと NSMutableString クラスの両方を、それぞれ "initWithString:" メソッドで作成した場合のクラス名は "NSCFString" となるようでした。ちなみに [NSString class] を文字列に変換した場合には、純粋に "NSString" という文字列が取得されました。

ちなみに nil に対して "NSStringFromClass" 関数を実行すると、戻り値としても nil が取得されるようでした。

インスタンスの種類を比較する

また、格納されているクラスの型が、あるクラスであるかを判定するには "isMemberOfClass:" メソッドを使用します。

// 変数 "obj" に "TestClass" というクラスのインスタンスが格納されているかを判定します。

BOOL is_member = [obj isMemberOfClass:[TestClass class]];

変数に "TestClass" の派生クラスが格納されている場合には、このように判定しても NO となります。

このクラスから派生しているクラスについても YES と判定したい場合には "isKindOfClass:" メソッドを使用します。

// 変数 "obj" に "TestClass" というクラスのインスタンスまたはそこから派生したクラスが格納されているかを判定します。

BOOL is_kind = [obj isKindOfClass:[TestClass class]];

このような形で、変数に格納されているクラスの判定を行うことができます。

 

ここでも、NSString のようなクラスクラスタを判定する場合は注意が必要です。

変数に NSString の "initWithString:" メソッドで作成したクラスインスタンスから取得できるクラスは "NSCFString" であるのに、[NSString class] で取得できるクラスは "NSString" のため、これを "isMemberOfClass:" で判定すると、NO と判定されるようでした。

この "NSCFString" については "NSString" の派生クラスとして扱われるようなので、"isKindOfClass:" メソッドであれば YES と判定されますけど、同様に NSMutableString クラスも "NSCFString" が取得できたりなど、このように、場面によってはそういったことを考えながら使用しないといけない様子でした。

クラスの情報を取得する

クラスの情報を文字列に変換する方法として、先ほどの NSStringFromClass 関数の他にも、"description" メソッドも用意されているようでした。

// クラス名やアドレスといった情報を文字列で取得できます。

NSString* info = [obj description];

ただ、以前はこれで、クラス名とアドレス情報が文字列で取得できたように思うのですけど、今、試してみたところ、なぜか文字列を取得することができませんでした。

何かの勘違いかもしれないですけど、とりあえずこちらはそのクラスが提供する情報を得るメソッドとして捉えて、純粋にそのクラスについての情報を取得したい場合には NSStringFromClass を利用するのが良いかもしれないです。

[ もどる ]