A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

动态类型、
动态绑定、
动态类型检测(检测对象和类相互之间的关系)、
对象能否响应对象方法(检测对象、类和方法之间的关系)、
怎么响应
1.动态类型
Person * yy =[Person new]  这是静态类型
将一个变量定义为特定类的对象是,使用的是静态形态
多态的实现:
Person * yy= [student new]  这是动态类型,程序直到执行时,才能确定变量所属的类
编译的时候看左边,是把yy当成人编译的,
运行的时候看右边,把yy当成狗运行
多态能让不同的类使用同名的方法,这回让程序的可读性大大提高,也降低了编译难度

id 类型
NSObject 是所有类的父类
所以多态时:
NSObject * 类型的变量可以用来接收任何类的对象,NSObject * obj=[xxx new]
但是使用obj调用xxx类的方法时,要记得强转
【 (xxx * )obj 方法名 】
obj被成为万能指针
下面引出id类型
id类型的都是万能指针
比如:id obj (不加*号,因为id性质和class一样,是个指针类型的别名)
有一点不同的是:id类型的万能指针调用方法的时候,不用强转,系统编译时,是不会去判断这个对象变量有没有这个方法的,是不会报错的

2.动态绑定(动态类型变量才有这种情况)
一个对象能否调用指定的方法不是由编译器决定的,是由运行时,决定的,这就叫动态绑定
例如:
Dog * wangcai =[Dog new]
Cat * kitty = [Cat new]
旺财明明是狗,但是如果你要强转它成猫,让它去执行猫的方法:抓老鼠,
这时候你编译时,是能通过的,但是运行时会报错
狗没有抓老鼠这个方法,所以不能执行,它只能执行自己的方法:看家,这就叫动态绑定

3.动态类型检测
(讲了三个判断方法)
1.判断实例对象是否是指定类或者这个类的子类的对象?
BOOL result = [对象名 isKindOfClass:类对象([Person class])];
2.判断实例对象是否是指定类的对象?
BOOL result = [对象名 isMemberOfClass:类对象[Person class]];
3.判断类是否是指定类的子类?(这个方法是类方法,所以是由类调用)
BOOL b2 = [类对象 [Student class] isSubClassOfClass:类对象 [Person class]]

4.判断对象能不能响应(调用)指定的对象方法
1).拿到sel
SEL 名字(比如aa) = @selector(方法名);
2).判断对象能否响应方法
BOOL result1 = [对象名 respondsToSelector: SEL类型的变量aa/或者直接写@selector(方法名)];

3).判断一个类里面有没有这个对象方法(注意是判断有没有对象方法,不要判断有没有类方法)
BOOL result1 = [类名 instanceRespondsToSelector: SEL类型的变量aa/或者直接写@selector(方法名)];

5.对象响应(调用)对象方法
1.响应没有参数的方法   [对象名 performSelector:SEL]
2.响应带参数的方法【对象名 performSelector:SEL/@selector(方法名,注意加 : )withobject@“…”/10数值
withobject:传得参数)

1 个回复

正序浏览
guyuexing 来自手机 中级黑马 2016-1-22 11:59:45
沙发
学习了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马