美文网首页iOS学习开发
Runtime 消息传递机制

Runtime 消息传递机制

作者: 留个念想给昨天 | 来源:发表于2018-04-03 17:53 被阅读28次
他的梦想:从你的全世界路过

求婚时,想给女友买颗好钻戒,
那颗他曾参与撰写文案的优雅钻戒,
承载着他的所有想象和创造力,
很多人被他的文案打动,而他自己却买不起。
他曾用最动情最直击人心的文案,
写过冰川和沙漠,大海和鲨鱼,
那些在他脑海中闪现过无数遍的自由美景,
他自己从没有时间去。
他的梦想:从你的全世界路过

于是他,转行了,做了iOS开发人

OC和C最本质的区别:

C语言 编译的时候,就知道你等下会调用哪一个函数!!
OC 编译的时候,其实不知道你要调用哪一个方法!!
C语言 是面向过程的编程语言
OC 则是面向对象的编程语言。

面向对象编程的代码更容易维护。它把具体的操作细节封装在类里,用的时候创建个对象,一顿调用方法,搞定!(当然类的实现方法还是需要自己写,面向对象只是一种编程思想。)

OC继承、或者说是拓展于C语言,OC里可以直接写C语言的代码,这是OC的向下兼容。

OC的底层是消息发送机制,在编译的时候是不知道调用的方法是否存在,只有在运行时才去找,找不到才报错。
今天就来讲讲OC的消息发送机制

1. 消息发送机制-不带参数的对象方法

新建一个工程,建一个Person类,写一个对象方法run方法

#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)run;
@end

#import "Person.h"

@implementation Person

-(void)run
{
    NSLog(@"哥么跑起来了");
}
@end

将Person引入ViewController,开始玩消息发送机制

#import "ViewController.h"
#import "Person.h"
//引入message就行了,因为message包含runtime
#import <objc/message.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person * p = [[Person alloc]init];
    
    //Xocde 5.0之后,苹果不建议使用底层的函数
    
    //给p 发送一个消息
    objc_msgSend(p, @selector(run));
}

@end

注意:Xocde 5.0之后,苹果不建议使用底层的函数,用objc_msgSend函数会报错

image.png

更改如下配置就可以了

image.png

改好了以后运行程序

image.png

就调用了Person的run方法

2. 消息发送机制-带参数的对象方法

在Person中再添加一个带参数的方法

@interface Person : NSObject
-(void)run;

-(void)eatWithFood:(NSString *)food;
@end

#import "Person.h"

@implementation Person

+(void)run
{
    NSLog(@"类方法在跑");
}

-(void)eatWithFood:(NSString *)food
{
    NSLog(@"吃%@",food);
}
@end
image.png

看objc_msgSend后面的...
说明可以用逗号分隔来穿参数,在ViewController如下写

#import "ViewController.h"
#import "Person.h"
//引入message就行了,因为message包含runtime
#import <objc/message.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person * p = [[Person alloc]init];
    
    //Xocde 5.0之后,苹果不建议使用底层的函数
    
    //给p 发送一个消息
//    objc_msgSend(p, @selector(run));
    //参数用逗号隔开
    objc_msgSend(p, @selector(eatWithFood:),@"香蕉");

}

运行,结果如下

image.png

3. 消息发送机制-类方法

在Person中如下写

#import <Foundation/Foundation.h>

@interface Person : NSObject
-(void)run;

-(void)eatWithFood:(NSString *)food;

+(void)run;
@end

#import "Person.h"

@implementation Person

+(void)run
{
    NSLog(@"类方法在跑");
}

-(void)eatWithFood:(NSString *)food
{
    NSLog(@"吃%@",food);
}

-(void)run{
    NSLog(@"哥么跑起来了");
}

@end

在ViewController如下写

#import "ViewController.h"
#import "Person.h"
//引入message就行了,因为message包含runtime
#import <objc/message.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //OC  调用类方法   Class类型它也是一个特殊的对象!!
//    [Person run];
    Class personClass = [Person class];
    
   //运行时
    objc_msgSend(personClass, @selector(run));
    
}

这样可以吗,事实证明是可以的

image.png

Class类型它也是一个特殊的对象!!
提供一份Demo,希望对你有帮助

想了解更多RunTime,可以参考:
Runtime 交换方法
Runtime 消息转发机制
写在最后:

希望这篇文章对您有帮助,最好就是实操一边,这样才能理解更深入。
当然如果您发现有可以优化的地方,希望您能慷慨的提出来。
最后祝您工作愉快!

相关文章

  • Runtime 的应用

    前面我们说到:Runtime 消息传递机制Runtime 消息转发机制Runtime 交换方法今天我们来谈谈Run...

  • iOS - Runtime - 概念和方法交换

    runtime的概述runtime的相关概念runtime消息机制消息传递动态方法解析消息转发runtime的作用...

  • iOS消息转发机制

    消息转发机制: 消息转发机制是相对于消息传递机制而言的。 1、消息(传递)机制 RunTime简称运行时。就是系统...

  • Runtime 消息传递机制

    求婚时,想给女友买颗好钻戒,那颗他曾参与撰写文案的优雅钻戒,承载着他的所有想象和创造力,很多人被他的文案打动,而他...

  • Runtime消息传递机制

    先看下整个Class的底层结构 objc_msgSend的源码是汇编实现的 objc_msgSend的执行流程01...

  • Objective-C Runtime浅析

    前言 Runtime是什么 Runtime的实现原理消息传递机制Runtime基础数据结构NSObject & i...

  • iOS 底层 - 名词解析

    目录 前言 名词解析 OC消息传递和转发机制 Runtime runtime动态创建类 Runloop Metho...

  • Runtime(一)消息传递机制

    Introduction The Objective-C language defers as many deci...

  • Runtime的工作原理(二)

    接着前面的说,之前说了runtime的交互、runtime的消息机制、传递、方法地址获取。 四、Dynamic M...

  • Runtime消息传递和消息转发|你一定看得懂

    Runtime简介==== Runtime的特性主要是消息(方法)传递机制,当向对象发送一条消息时,如果能在对象的...

网友评论

本文标题:Runtime 消息传递机制

本文链接:https://www.haomeiwen.com/subject/yvsqhftx.html