动态类型、 动态绑定、 动态类型检测(检测对象和类相互之间的关系)、 对象能否响应对象方法(检测对象、类和方法之间的关系)、 怎么响应 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:传得参数)
|