Objective-Cでオブジェクトがどのクラスかをテストするにはどうすればよいですか?


207

オブジェクトがObjective-Cの特定のクラスのインスタンスであるかどうかをテストするにはどうすればよいですか?オブジェクトaがクラスbまたはクラスcのインスタンスであるかどうかを確認したい場合は、どうすればよいですか?

回答:


345

オブジェクトがクラスaのインスタンスかどうかをテストするには:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

または

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

オブジェクトのクラス名を取得するには、NSStringFromClass関数を使用できます。

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

またはObjective-CランタイムAPIのC関数:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

編集: In Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

69
class_getName()の#import <objc / runtime.h>を忘れないでください
Ovesh

6
このためのクラスメソッドもあります。
アレクサンダーウォリン

3
私の理解では、これはNSObjectを継承するオブジェクトに対してのみ機能するということです。
ヘンリックP.ヘッセル

1
@afEkenholm-ただし、iOS 4.xではできません。
JJ Rohrer、2011年

2
class_getName以上を使用する利点は何NSStringFromClassですか?ない場合は、この回答を調整する必要があります。
Dan Rosenstark 2013

21

あなたも使うことができます

NSString *className = [[myObject class] description]; 

NSObject


8
これは、プログラマーが記述メソッドをオーバーライドしたかどうかに基づいて機能する場合と機能しない場合があります。ただし、[オブジェクトクラス]またはNSStringFromClassを使用すると、常にクラス名が返されます。
futureelite7 2013年

1
ミステリーオブジェクトのデバッグと種類を知るのに最適です!
Mジェシー

3

AppleドキュメントのisKindOfClassの意味

クラスクラスターで表されるオブジェクトでこのメソッドを使用するときは注意してください。クラスクラスターの性質上、返されるオブジェクトは必ずしも期待したタイプとは限りません。クラスクラスターを返すメソッドを呼び出す場合、メソッドによって返される正確な型が、そのオブジェクトで何ができるかを示す最良の指標です。たとえば、メソッドがNSArrayオブジェクトへのポインタを返す場合、次のコードに示すように、このメソッドを使用して配列が変更可能かどうかを確認しないでください。

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

このような構造をコードで使用する場合、実際には変更してはならないオブジェクトを変更しても大丈夫だと思うかもしれません。そうすると、オブジェクトが変更されないままであると期待していた他のコードで問題が発生する可能性があります。


あなたのサンプルコードは正しくありません。とにかく不変であるNSArrayをテストする場合にのみ問題が発生します。特定のクラスをテストする場合は、代わりにisMemberOfClassを使用する必要があります。
futureelite7 2014年

@ futureelite7これは、クラスタイプをテストしない方法の例です。アップルのドキュメントの状態-isKindOfClass:-isMemberOfClass:クラスクラスタ内のオブジェクトを識別するために使用すべきではありません。
pxpgraphics


1

クラスの名前を取得したい場合は、以下を呼び出します。

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);

0

実行時間も確認できます。コードにブレークポイントを1つ配置し、(lldb)コンソールに書き込みます

(lldb) po [yourObject class]

このような..

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.