Id类型及应用场景和动态类型的检测 
 
一、NSObject是所有类的基类,可以指向任何对象 
   NSObject和id都可以指向任何对象 
   NSObject对象会对进行编译检查(需要强制类型转换) 
   Id不需要强制类型转换,id可以直接用 
   编译器看到id以后,认为是动态类型,不在检查类型 
   Id使用 
   Id obj; 
   Obj=ani;//ani是子类的实例对象 
   [obj run]; 
   Instancetype 和id的异同: 
1) 相同点 
  都可以作为方法的返回类型 
2)不同点 
   Instancetype 可以返回和方法所在类型相同类型的对象,id只能返回未知数据类型的对象; 
  Instancetype只能作为返回值,不能像id那样作为参数 
二、动态类型的检测 
   1.判断类型检测 
1)判断某个对象是否是类的实例对象,或者子类的实例对象 
  isKindOfClass 使用格式:[对象  isKindOfClass  类对象] 
  BOOl  isInstance=[ d  isKindOfClass:[Animal Class] ]; 
2)isMemberOfClass 判断对象是否是指定类的实例对象  
     使用格式:[对象  isMemberOfClass:类对象] 
isInstance=[dog isMemberOfClass:[Animal class]];//只能判断当前类或者当前类的子类而子类的子类返回结果为假 
3)判断类是否是指定类的子类(类和类之间的关系) 
      BOOL  isSub=[Dog isSubclassOfClass:[Animal class]];  //Dog 类继承自Animal 
      通过对象来获取类对象 
      IsSub=[[dog class]isSubclassOfClass:[ani  class]]; 
格式: 
[类 A isSubclassOfClass:类B] 
判断类A是否是类B的子类  是yes  不是no 
 |   
        
 
    
    
    
     
 
 |