iOS_小蟹专题runtime相关IOS三人行

猫猫学iOS之RunTime理解运用

2016-06-16  本文已影响822人  翟乃玉

猫猫分享,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://www.jianshu.com/notebooks/4236923/latest

一:RunTime简介

Objective-C是一门动态语言,他将一些工作从编译阶段推迟到了运行阶段,比如调用方法:

  1. 在C语音当中,调用方法在编译的时候就知道具体调用哪个方法;(C语言调用 未实现的方法 就会报错)

    图1.1 只定义方法,未实现
    1.1 如图1.1 在掉用只声明而没有实现的方法,在编译的时候就直接报错了。
    图1.2
    1.2 正确的应该是图1.2
  2. 在Objective-C语音当中,调用方法是动态的,在编译的时候并不能真正决定调用哪个方法(只要有声明,既是没有实现就不会报错),只有在真正运行的时候才会根据方法的编号(名称)找到对应的方法来调用。

    2.1
    2.1 图2.1中定义了Cat类,然后声明了吃食物的方法,没有实现方法的情况下只是报了警告,但是在运行的时候就会报错:
    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Cat eatWithFood:]: unrecognized selector sent to instance 0x7f9b1b4da8e0'
  //定义类
  @interface Cat : NSObject
  - (void)eatWithFood:(NSString *)food;
  + (void)eatWithFood:(NSString *)food;
  @end

  @implementation Cat
  @end

 //调用
 Cat *cat = [[Cat alloc]init];
  [cat eatWithFood:@"鱼"];

RunTime翻译过来就是运行时,其实就是OC的运行时机制,搜索runtime会发现很多都有运行时机制,简单说就是运行的时候的一些机制,在OC中最主要的就是消息机制

二:RunTime的准备

三:RunTime的运用

定义猫类并且实现方法,后面都是根据这个类玩的。

@interface Cat : NSObject
- (void)eatWithFood:(NSString *)food;
+ (void)eatWithFood:(NSString *)food;
@end

@implementation Cat

-(void)eatWithFood:(NSString *)food{
    NSLog(@"对象方法————  对象猫在吃%@",food);
}

+(void)eatWithFood:(NSString *)food{
    NSLog(@"类方法————  猫类在吃%@",food);
}
@end

1、RunTime调用对象方法

//初始化对象
    Cat *cat = [[Cat alloc]init];
    //最常用的方法调用
    [cat eatWithFood:@"鱼"];
    //perfor方法调用
    [cat performSelector:@selector(eatWithFood:) withObject:@"肉"];
    //runtime调用
    objc_msgSend(cat, @selector(eatWithFood:),@"老鼠");

其实这三种方式最终都会用runtime来执行。

2、RunTime调用类方法

//最常用的方法调用
    [Cat eatWithFood:@"鱼"];
    //类对象
    Class catClass = [Cat class];
    //perfor方法调用
    [catClass performSelector:@selector(eatWithFood:) withObject:@"肉"];
    //runtime调用
    objc_msgSend(catClass, @selector(eatWithFood:),@"老鼠");

对于类方法来说,其实其本质还是说用对象调用方法,已知,对象调用方法的本质是让对象发送消息,我们可以看出,类方法的调用其实就是底层让类对象发送消息,从而实现类方法的调用。

图来源于网络
上一篇 下一篇

猜你喜欢

热点阅读