isKindOfClassとisMemberOfClass
特定のオブジェクトがどのクラスのインスタンスかを判定して処理を分岐させたいときはisKindOfClass:
だったりisMemberOfClass:
というメソッドが使えます。
どちらもNSObject
プロトコルで宣言されているので、iOS開発をしている場合は基本的にどのクラスでも利用することができます。
isKindOfClassとisMemberOfClassの違い
じゃあどっちがどーなのよという話で、端的にいうと
isKindOfClass:
は継承関係も含めて判断する、isMemberOfClass:
は継承関係を含めないで判断する
ということです。
たとえば、UIImageView
はUIView
のサブクラスですので、
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:
を使ってしまうと思わぬバグを仕込む可能性があり、しまっちゃうおじさんにしまわれてしまうので注意しておきたいところです。