Runtime 一一 runtime作用-发送消息
2018-01-26 11:38
246 查看
OC中任何方法的调用本质: 发送一个消息,用runtime发送消息,OC底层实现通过runtime实现.
使用场景:
1. 当调用私有方法的时候,可以使用runtime来发送消息
- (void)viewDidLoad {
[super viewDidLoad];
// 使用runtime发送消息的应用场景:
// 1. 当调用一些私有的方法时,可以使用runtime来调用
// 最终生成消息机制,编译器做的事情
// 最终代码,需要把当前的代码重新编译,用Xcode编译器 clang
// Person *p = [Person alloc];
// Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
Person *p = objc_msgSend([Person class], @selector(alloc));
// p = [p init];
// p = objc_msgSend(p, sel_registerName("init"));
p = objc_msgSend(p, @selector(init));
// 当eat为私有方法时,当p对象是通过runtime来创建的,此时调用eat方法不会报错
[p eat];
// objc_msgSend(p, sel_registerName("eat"));
objc_msgSend(p, @selector(eat));
// 使用runtime调用多个参数的方法
objc_msgSend(p, @selector(run:),@99);
// 方法调用流程
// 1. 通过对象的isa指针去对应的类中查找
// 2. 注册方法编号
// 3. 根据方法编号去查找对应的方法
// 4. 找到的只是地址,根据地址去方法区调用对应的函数
}
- (void)test
{
// id objc = [NSObject alloc];
// 类方法本质: 类对象调用[NSObject class]
// id: 谁发送消息
// SEL: 发送什么消息
// 注意: Xcode6之前,苹果运行使用objc_msgSend. 而有参数提示
// Xcode6苹果不推荐我们使用runtime
// 找到build setting->搜索msg , NO
// ((NSObject *(*)(id, SEL))(void *)objc_msgSend)([NSObject class], @selector(alloc));
id objc = objc_msgSend([NSObject class], @selector(alloc));
// objc = [objc init];
objc = objc_msgSend(objc, @selector(init));
}消息机制原理:对象根据方法编号SEL去映射表查找对应的方法实现
使用场景:
1. 当调用私有方法的时候,可以使用runtime来发送消息
- (void)viewDidLoad {
[super viewDidLoad];
// 使用runtime发送消息的应用场景:
// 1. 当调用一些私有的方法时,可以使用runtime来调用
// 最终生成消息机制,编译器做的事情
// 最终代码,需要把当前的代码重新编译,用Xcode编译器 clang
// Person *p = [Person alloc];
// Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
Person *p = objc_msgSend([Person class], @selector(alloc));
// p = [p init];
// p = objc_msgSend(p, sel_registerName("init"));
p = objc_msgSend(p, @selector(init));
// 当eat为私有方法时,当p对象是通过runtime来创建的,此时调用eat方法不会报错
[p eat];
// objc_msgSend(p, sel_registerName("eat"));
objc_msgSend(p, @selector(eat));
// 使用runtime调用多个参数的方法
objc_msgSend(p, @selector(run:),@99);
// 方法调用流程
// 1. 通过对象的isa指针去对应的类中查找
// 2. 注册方法编号
// 3. 根据方法编号去查找对应的方法
// 4. 找到的只是地址,根据地址去方法区调用对应的函数
}
- (void)test
{
// id objc = [NSObject alloc];
// 类方法本质: 类对象调用[NSObject class]
// id: 谁发送消息
// SEL: 发送什么消息
// 注意: Xcode6之前,苹果运行使用objc_msgSend. 而有参数提示
// Xcode6苹果不推荐我们使用runtime
// 找到build setting->搜索msg , NO
// ((NSObject *(*)(id, SEL))(void *)objc_msgSend)([NSObject class], @selector(alloc));
id objc = objc_msgSend([NSObject class], @selector(alloc));
// objc = [objc init];
objc = objc_msgSend(objc, @selector(init));
}消息机制原理:对象根据方法编号SEL去映射表查找对应的方法实现
相关文章推荐
- 神经病院Objective-C Runtime住院第二天——消息发送与转发
- 初识 Runtime机制 - 发送消息
- runtime - 消息发送(objc_msgSend)
- 从发送一个消息(调用一个方法)来说 Runtime
- java.lang.RuntimeException: 将消息发送到死的线程上处理程序的处理程序 (android.os.Handler)
- [Runtime]-发送消息
- runtime从入门到精通(五)—— 消息发送和消息转发
- iOS_Runtime1_消息发送机制
- [置顶] iOS runtime 之消息发送机制三次拯救机会
- runtime1 - 消息发送机制
- 神经病院Objective-C Runtime住院第二天——消息发送与转发
- 父作用域和子作用域 点击按钮互相发送消息
- runtime消息发送
- Runtime 一一 runtime作用-交换方法
- 简谈runtime运行机制之消息发送与转发
- grilas项目中集成dubbo进行同步发送消息问题
- Rossum--ROSjava的消息发送
- metaq生产者发送消息找不到指定partition调查
- Activemq 消息发送、接收java代码实现队列模式
- handler底层是如何将消息从子线程发送到主线程