isKindOfClassとisMemberOfClass
isKindOfClassとisMemberOfClassはどちらもあるオブジェクトが特定のクラスのインスタンスかどうかを判断するためのメソッドです。
それではこの2つは何が違うのでしょう??
isKindOfClassは同一または親子関係にあるクラスを判定する為に使用する
isMemberOfClassは自身と同一のクラスかどうかを判定する為に使用する
上記のような違いがあるようです。
サンプルコード
下記のコードを見ると、isKindOfClassでは親と同クラスの時にYESが返ってきて、isMemberOfClassでは同クラスのみYESが返ってきてます。
// @interface MyURL : NSURL @end
/* isKindOfClass */
NSURL *url = [NSURL URLWithString:@"http://marycore.jp"];
[url isKindOfClass:NSNumber.class]; // NO (無関係なクラス)
[url isKindOfClass:NSObject.class]; // YES (親クラス)
[url isKindOfClass:NSURL.class]; // YES (同クラス)
[url isKindOfClass:MyURL.class]; // NO (子クラス)
/* isMemberOfClass */
NSURL *url = [NSURL URLWithString:@"http://marycore.jp"];
[url isMemberOfClass:NSNumber.class]; // NO (無関係なクラス)
[url isMemberOfClass:NSObject.class]; // NO (親クラス)
[url isMemberOfClass:NSURL.class]; // YES (同クラス)
[url isMemberOfClass:MyURL.class]; // NO (子クラス)
isMemberOfClassの注意点
NSString型やNSNumberクラス等の標準クラスでは正常に動作しません。理由としては、例えばNSString型のインスタンスは__NSCFStringやNSTaggedPointerStringという特殊なインスタンスで表現されることがあるためです。
その為、下記のようにNOが結果として返ってきます。
[@"" isMemberOfClass:NSString.class]; // NO (?!)a
またコンクリートクラスと呼ばれる特殊なクラスから生成されたインスタンスに対しても使用できないので、注意が必要です。