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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chunhuayun 中级黑马   /  2015-10-5 15:24  /  646 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、动态绑定
1)在OC中,一个对象是否调用指定的方法不是有编译器决定而是由运行时决定,这杯称作【方法的动态绑定】
2)在OC中,对象不调用方法,而是接受消息,消息表达式为:[reciver message];

2、动态类型检测方法
1)判断类型
A、- (BOOL)isKindOfClass:(Class)aClass;
判断某个对象是不是某个类的实例对象或者是其子类的实例对象
B、- (BOOL)isMemberOfClass:(Class)aClass;
判断对象是否是指定类的实例,不管是不是其子类的实例
C、+ (BOOL)isSubclassOfClass:(Class)aClass;
//判断类是否是指定类的子类
例如:
  1. #import <Foundation/Foundation.h>
  2. #pragma mark Animal类声明部分
  3. @interface Animal: NSObject
  4. -(void)eat;
  5. @end
  6. #pragma mark Animal类实现部分
  7. @implementation Animal
  8. -(void)eat{
  9.     NSLog(@"Animal eat...");
  10. }
  11. @end
  12. #pragma mark Dog类声明部分
  13. @interface Dog: Animal
  14. -(void)eat;
  15. @end
  16. #pragma mark Dog类实现部分
  17. @implementation Dog
  18. -(void)eat{
  19.     NSLog(@"Dog eat...");
  20. }
  21. @end


  22. int main(int argc, const char * argv[])
  23. {

  24.     @autoreleasepool {
  25.         id dog = [Dog new];
  26.         //检测一下是否是Animal的类实例对象,或是其子类的实例
  27.         if ([dog isKindOfClass:[Animal class]]) {
  28.             NSLog(@"dog is a kind of Animal");
  29.         } else{
  30.             NSLog(@"dog is not a kind of Animal");
  31.         }
  32.         //判断对象是否是指定类的实例,不管是不是其子类的实例
  33.         if ([dog isMemberOfClass:[Animal class]]) {
  34.             NSLog(@"dog is a member of Animal");
  35.         }else{
  36.             NSLog(@"dog is not a member of Animal");
  37.         }
  38.         //判断类是否是指定类的子类
  39. //[Dog isSubclassOfClass:[Animal class]]也可以
  40.         if ([[dog class]isSubclassOfClass:[Animal class]]) {
  41.             NSLog(@"dog is a subclass of Animal");
  42.         }else{
  43.             NSLog(@"dog is not a subclass of Animal");
  44.         }

  45.     }
  46.     return 0;
  47. }
复制代码


打印结果:
2015-10-05 11:11:57.473 Demo01[1600:303] dog is a kindof Animal
2015-10-05 11:11:57.474 Demo01[1600:303] dog is not amember of Animal
2015-10-05 11:11:57.475 Demo01[1600:303] dog is asubclass of Animal

2)判断某一个类实例变量能否响应某个方法
例如:
  1.         id dog = [Dog new];
  2.         //判断dog能否响应eat方法
  3.         if ([dog respondsToSelector:@selector(eat)]) {
  4.             [dog eat];
  5.         }else{
  6.             NSLog(@"dog cannnot respond to eat function");
  7.         }
复制代码


打印结果;
2015-10-05 11:15:34.217 Demo01[1620:303] Dog eat...

3)判断类是否有某个方法
  1.         //判断类能否响应eat方法,可以理解为该类中有木有eat方法,可以是从父类继承的,【注意】更对象响应不一样
  2.         if ([Dog instancesRespondToSelector:@selector(eat)]) {
  3.             NSLog(@"Dog have eat function");
  4.         }else{
  5.             NSLog(@"Dog have no eat function");
  6.         }
复制代码

打印结果:

2015-10-05 11:21:14.717 Demo01[1702:303] Dog have eatfunction

4)响应方法
  1. <font size="4">#import <Foundation/Foundation.h>
  2. #pragma mark Animal类声明部分
  3. @interface Animal: NSObject
  4. -(void)eat;
  5. @end
  6. #pragma mark Animal类实现部分
  7. @implementation Animal
  8. -(void)eat{
  9.     NSLog(@"Animal eat...");
  10. }
  11. @end
  12. #pragma mark Dog类声明部分
  13. @interface Dog: Animal
  14. -(void)eat:(NSString*)food;
  15. -(void)eat:(NSString*)name andFood:(NSString*)food;
  16. @end
  17. #pragma mark Dog类实现部分
  18. @implementation Dog
  19. -(void)eat:(NSString*)food{
  20.     NSLog(@"Dog eat %@",food);
  21. }
  22. -(void)eat:(NSString*)name andFood:(NSString*)food{
  23.     NSLog(@"%@ eat %@",name,food);
  24. }
  25. @end


  26. int main(int argc, const char * argv[])
  27. {

  28.     @autoreleasepool {
  29.         id dog = [Dog new];
  30.         //判断dog能否响应eat方法
  31.         //响应无参方法
  32.         SEL sel = @selector(eat);
  33.         if ([dog respondsToSelector:sel]) {
  34.            [dog performSelector:sel];
  35.         }else{
  36.             NSLog(@"dog cannnot respond to eat function");
  37.         }
  38.         //响应有参方法,一个参数
  39.         SEL sel2 = @selector(eat:);
  40.         if ([dog respondsToSelector:sel2]) {
  41.             [dog performSelector:sel2 withObject:@"Fish"];
  42.         }else{
  43.             NSLog(@"dog cannnot respond to eat function");
  44.         }
  45.                 //响应有参方法,两个参数
  46.         SEL sel3 = @selector(eat:andFood:);
  47.         if ([dog respondsToSelector:sel3]) {
  48.             [dog performSelector:sel3 withObject:@"小黑" withObject:@"Shit"];
  49.         }else{
  50.             NSLog(@"dog cannnot respond to eat function");
  51.         }
  52.     }
  53.     return 0;
  54. }</font>
复制代码
打印结果:
2015-10-05 11:41:15.543 Demo01[1871:303] Animal eat...
2015-10-05 11:41:15.546 Demo01[1871:303] Dog eat Fish
2015-10-05 11:41:15.546 Demo01[1871:303] 小黑 eat Shit


1 个回复

倒序浏览
这块还没学到。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马