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
|
|