0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Objective-C】isKindOfClassとisMemberOfClassの違い

Posted at

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

またコンクリートクラスと呼ばれる特殊なクラスから生成されたインスタンスに対しても使用できないので、注意が必要です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?