区别方法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.首先申明 四个类 WZ *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。

以下的类层次是这样的,BaseZombie是所有僵尸类的基类,ZombieType1是继承于BaseZombie的一个类,textType是继承于ZomboeType1的类

[objc] view plain copy
  1. @interface BaseZombie : NSObject  
  2. @interface ZombieType1 : BaseZombie  
  3. @interface textType1 : ZombieType1//失误了,记得类名开头大写  

     首先看一下开发文档中描述isKindOfClass

[objc] view plain copy
  1. - (BOOL)isKindOfClass:(Class)aClass  
  2. Description   
  3. 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. (required)  
  4.   
  5. //意思是返回一个BOOL类型的值,表示调用该方法的类 是否是 参数类 或者 继承于参数类  
通过程序来反馈下结果会更加的明显,

[objc] view plain copy
  1. textType1 * text1 = [[textType1 alloc]init];//初始化一个测试子类  
  2.           
  3. BOOL b1 = [text1 isKindOfClass:[textType1 class]];//YES  
  4. BOOL b2 = [text1 isKindOfClass:[ZombieType1 class]];//YES  


      接下来看一下开发文档中的描述isMemberOfClass

[objc] view plain copy
  1. - (BOOL)isMemberOfClass:(Class)aClass  
  2. Description   
  3. Returns a Boolean value that indicates whether the receiver is an instance of a given class. (required)  
  4.   
  5. //意思是返回一个BOOL类型的值,表示调用该方法的类 是否是 参数类  

通过程序反馈结果如下

[objc] view plain copy
  1. BOOL b3 = [text1 isMemberOfClass:[textType1 class]];//YES  
  2. BOOL b4 = [text1 isMemberOfClass:[ZombieType1 class]];//NO 父类不被承认  

        最后一个是开发文档中的isSubclassOfClass

[objc] view plain copy
  1. //注意这是一个类方法  
  2. + (BOOL)isSubclassOfClass:(Class)aClass  
  3. Description   
  4. Returns a Boolean value that indicates whether the receiving class is a subclass of, or identical to, a given class.  
  5.   
  6. //意思是返回一个BOOL类型的值,表示调用该方法的类 是不是 参数类的一个子类 或者 是这个类的本身  


程序反馈如下

[objc] view plain copy
  1. BOOL b5 = [textType1 isSubclassOfClass:[ZombieType1 class]];//YES  
  2. BOOL b6 = [textType1 isSubclassOfClass:[textType1 class]];//YES  
  3. BOOL b7 = [textType1 isSubclassOfClass:[NSString class]];//NO  

1.对象的分配、初始化和复制

 NSObject类中的一些方法(包括来自协议的方法)用于对象的创建、初始化和复制。

A. alloc和allocWithZone方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。

B. init方法是对象初始化原型,负责将对象的实例变量设置为一个已知的状态。

C. initalize和load是两个类方法,它们让对象有机会对自身进行初始化。

D. new 是一个将简单的内存分配和初始化结合起来的便利方法。

E.  copy 和copyWithZone方法用于复制这些(由NSCopying协议定义的)方法的类的实例。

F.  mutableCopy和mutableCopyWithZone方法,希望支持可变对象的类则需要实现该方法(由NSMutableCopying协议定义)。

2.对象的保持和清理

A. retain 方法增加对象的保持数。

B. release方法减少对象的保持数。

C. autorelease方法减少对象的保持数,但是已推迟的方式。

D. retainCount方法返回当前对象的保持数。

E.  dealloc 方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。

 

3.对象的内省和比较

A. superclass 和class 方法分别以Class对象的形式返回接受者的父类和类。

B. isKindOfClass方法判断当前实例是否属于该类或父类。

C. isMemberOfClass 方法判断当前实例是否属于该类。

D. conformsToProtocol 方法判断当前实例类或父类是否实现了指定协议

( 如:[dog conformsToProtocol:@protocol(MyProtocol)]  dog实例的类是否实现了MyProtocol协议,如果该实例类或其该实例类的父类实现了该协议则返回 true)。

E. class_conformsToProtocol 方法只判断当前类符不符合协议,和其父类无关。

F.  isEqual方法首先判断两个对象是否类型一致, 在判断具体内容是否一致

G. isEqualTo方法个直接判断字符串内容,当然你要确保比较的对象保证是字符串。

H. isSubclassOfClass 类方法,判断当前类是否为指定的子类。

(如:[Dog  isSubclassOfClass:[NSObjectclass]]  Dog类是否属于 NSObject的子类。返回true)。

I.  instancesRespondToSelector类方法,判断当前类是否有指定的实例方法。

(如:[Dog instancesRespondToSelector:@selector(setNumber:)]  Dog类是否有实例方法 setNumber)。

你可能感兴趣的:(面试题)