iOS开发中,经常会遇到NSObject比较Class的情况。苹果提供了三种判断的方式:isKindOfClass、isMemberOfClass和isSubclassOfClass,但是这三种方式的使用场景需要区分使用。
一、苹果官方API的解释是:
isKindOfClass: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.
isMemberOfClass:Returns a Boolean value that indicates whether the receiver is an instance of a given class.
isSubclassOfClass:Returns a Boolean value that indicates whether the receiving class is a subclass of, or identical to, a given class.
二、它们的作用的区别:
isKindOfClass:判断对象是否为某类或者其派生类的实例(对象方法);
isSubclassOfClass:判断对象是否为某类或者其派生类的实例(类方法);
isMemberOfClass:判断对象是否为某个特定类的实例(对象方法);
三、举一个例子,来演示一下这三者的使用场景:
1.首先申明 四个类 W<X<Y<Z,继承关系 Z继承Y,Y继承X,X继承W。即W是最顶层的父类,Z是最基层的子类。 Z *z = [[Z alloc] init]; 2.isKindOfClass(对象方法) [z isKindOfClass [Z Class]] //返回YES [z isKindOfClass [Y Class]] //返回 YES [z isKindOfClass [X Class]] //返回 YES [z isKindOfClass [W Class]] //返回 YES 3.isMemberOfClass(对象方法) [z isMemberOfClass [Z Class]] //返回 YES [z isMemberOfClass [Y Class]] //返回 NO [z isMemberOfClass [X Class]] //返回 NO [z isMemberOfClass [W Class]] //返回 NO 4.isSubclassOfClass(类方法) [Z isSubclassOfClass [Z Class]] //返回 YES [Z isSubclassOfClass [Y Class]] //返回 YES [Z isSubclassOfClass [X Class]] //返回 YES [Z isSubclassOfClass [W Class]] //返回 YES
综合上面的例子,可以看到isSubclassOfClass和isKindOfClass的作用基本上是一致的,都是用来判断一个对象或一个类是否为某个类或者某个类的子类,只是isSubclassOfClass是类方法,isKindOfClass是对象方法;isMemberOfClass 筛选条件更为精确、苛刻,只有当类型完全匹配的时候,它才会返回YES。