美文网首页
OC · 记——Runtime(一) 发送消息

OC · 记——Runtime(一) 发送消息

作者: 行走的苹果哥 | 来源:发表于2017-01-18 11:01 被阅读49次

Runtime介绍

运行时,OC就是运行时机制,最主要的是消息机制。
对于C语言,函数的调用在编译的过程中会决定调用哪个函数。
对于OC,则属于动态调用过程,只有在真正运行的时候才会根据函数名找到对应的函数。

Runtime作用

1.发送消息 objc_msgSend
方法调用的本质,就是让对象发送消息。
2.交换方法 method_exchangeImplementations
系统自带的方法功能不够时,想给系统自带的方法扩展一些功能,并且保持原有的功能。
3.动态添加方法 class_addMethod
如果一个类的方法很多,加载类到内存的时候耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。
4.动态添加属性 objc_setAssociatedObject
给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间,就是对象本身的属性可以关联到另外一个内存中。

发送消息

使用运行时的第一步:
1.#import <objc/message.h>
2.xcode-->build settings->搜索msg

Paste_Image.png
我们先创建一个Person对象,创建一个类方法,一个对象方法,如下代码所示:
#import "Person.h"
@implementation Person
+ (void)eat
{
    NSLog(@"类方法——吃饭");
}
- (void)eat
{
    NSLog(@"对象方法——吃面");
}
@end

我们在控制器中调用,首先,#import "Person.h"

Person * p = [[Person alloc] init];
//我们一般调用对象方法,都会这样写:[p eat],
//现在用runtime让对象p发送一个消息。
objc_msgSend(p, @selector(eat));
//按照以前,我们调用类方法,都会是这样写的
//[Person eat] 那使用runtime调用类方法,跟调用对象方法类似。
//获取类对象
Class personClass = [Person class];
//运行时:拿到类对象,调用类方法。
objc_msgSend(personClass, @selector(eat));

ok,我们运行程序:

2017-01-18 10:46:22.940 [70808:6452367] 对象方法——吃面
2017-01-18 10:46:22.940 [70808:6452367] 类方法——吃饭

现在我再写一个对象方法,添加一个值,在控制器中传过去。

- (void)ride:(int)age
{
    NSLog(@"%d",age);
}

控制器中调用

objc_msgSend(p, @selector(ride:),10);

运行结果:

2017-01-18 10:51:41.083 [71101:6456914] 10

如果我们不用runtime来发送消息,还有另外一种方式也可以调用类方法和对象方法,那就是SEL。

Person * p = [[Person alloc] init];
//SEL:方法编号,根据方法编号就可以找到对应方法实现,属于动态调用
[p performSelector:@selector(eat)];
//获取类对象
//类名调用类方法,本质类名转换成类对象
Class personClass = [Person class];
[personClass performSelector:@selector(eat)];

运行结果一样:

2017-01-18 10:46:22.940 [70808:6452367] 对象方法——吃面
2017-01-18 10:46:22.940 [70808:6452367] 类方法——吃饭

相关文章

  • OC · 记——Runtime(一) 发送消息

    Runtime介绍 运行时,OC就是运行时机制,最主要的是消息机制。对于C语言,函数的调用在编译的过程中会决定调用...

  • runtime的消息机制

    任何方法调用本质:发送一个消息,用runtime发送消息,OC底层实现通过runtime实现; 我们平时书写的代码...

  • runtime介绍

    前言:任何方法调用的本质:发送一个消息,用runtime来发送消息,OC底层实现通过runtime来实现。 run...

  • Runtime的底层实现

    任何方法调用的本质: 其实是发送了一个消息, 用runtime发送消息, OC底层实现通过runtime实现最终生...

  • runtime 消息机制简析

    runtime 消息机制消息机制可以简单分为三个方面:消息发送、动态方法解析、消息转发一.消息发送oc 中所有的方...

  • runtime解析及常用方法

    什么是runtime? runtime直译:运行时机制;OC发送消息的本质,就是 runtime去调用苹果底层的一...

  • iOS 2019年2月学习记录

    消息发送与转发1.1 简介OC的消息机制是通过runtime实现的,消息发送是通过selector快速查找IMP的...

  • runtime自学日记

    1.runtime 是什么 runtime 就是运行时。 2.为什么要有runtime 根据OC的特性“消息发送机...

  • runtime的实用性讲解

    runtime 概念 runtime 运行时机制,主要是消息机制。OC 中的方法调用属于消息的发送,动态调用过程,...

  • OC-Runtime消息发送

    Objective-C动态性的根源在方法的调用是通过message来实现的,一次发送message的过程就是一次方...

网友评论

      本文标题:OC · 记——Runtime(一) 发送消息

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