Runtime 一一 runtime作用-发送消息

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去映射表查找对应的方法实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值