おすしたべたい

おすしがたくさん食べられるようにがんばるブログ

isKindOfClassとisMemberOfClass

特定のオブジェクトがどのクラスのインスタンスかを判定して処理を分岐させたいときはisKindOfClass:だったりisMemberOfClass:というメソッドが使えます。

どちらもNSObjectプロトコルで宣言されているので、iOS開発をしている場合は基本的にどのクラスでも利用することができます。

isKindOfClassとisMemberOfClassの違い

じゃあどっちがどーなのよという話で、端的にいうと

isKindOfClass:は継承関係も含めて判断する、isMemberOfClass:は継承関係を含めないで判断する

ということです。

たとえば、UIImageViewUIViewのサブクラスですので、
isKindOfClass:を用いた

UIImageView *imageView = [UIImageView new];
BOOL result = [imageView isKindOfClass:[UIView class]];
NSLog(@"[imageView isKindOfClass:[UIView class]] -> %d", result);

resultは1 (YES)ですが、isMemberOfClass:を用いた

UIImageView *imageView = [UIImageView new];
BOOL result = [imageView isMemberOfClass:[UIView class]];
NSLog(@"[imageView isKindOfClass:[UIView class]] -> %d", result);

resultは0 (NO)になります。

ということで、本当にexactlyにそのクラスのインスタンスかどうか知りたいよというのみisMemberOfClass:を使います。

これまでの経験上isKindOfClass:を使うことが圧倒的に多いです。
これらの違いを理解しておかないままisMemberOfClass:を使ってしまうと思わぬバグを仕込む可能性があり、しまっちゃうおじさんにしまわれてしまうので注意しておきたいところです。

しまっちゃうおじさんにしまわれちゃう図