runtime:消息机制

Posted MakeKeyResuseable

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了runtime:消息机制相关的知识,希望对你有一定的参考价值。

会oc不会runtime就是不懂oc。近期项目需要做一些热更新,顺带着复习一下。

首先必须知道的是,oc的消息机制。废话不多说,直接上代码和注释。

//
//  main.m
//  rumtime
//
//  Created by 123 on 16/7/4.
//  Copyright © 2016年 yipinbaike. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <objc/message.h>

@interface Person : NSObject
- (void)run;
+ (void)run;
- (void)eatWith:(NSString*)food;
@end
@implementation Person
- (void)run
{
    NSLog(@"对象方法run");
}
+ (void)run{
    NSLog(@"类方法run");
}
- (void)eatWith:(NSString*)food{
    NSLog(@"吃了:%@",food);
}
@end

void text1();
void text2();
int main(int argc, const char * argv[]) {
    @autoreleasepool {
//        text1();
        text2();
    }
    return 0;
}

#pragma mark --消息机制
/*
    oc方法和c语言函数是不一样的,oc在编译的时候是不知道真正调用的是哪个函数,只有真正的在运行的时候才会通过函数名找到真正要调用的函数
    oc语言采用的是消息机制,例如在text1中,调用的循序一次是从上到下三个方法。
 */
//1.测试消息机制(不含参)
void text1(){
    //实例对象方法
    Person * person = [[Person alloc]init];
    [person run];
    [person performSelector:@selector(run)];
    objc_msgSend(person,@selector(run));
    //类对象方法
    //需要注意的是,直接使用 objc_msgSend(Person, @selector(run)) 是不被允许的。因为类方法的调用的实质是:将类名转化成类对象。而Person只是一个类名,不能直接调用消息函数 objc_msgSend()
    Class personClass = [Person class];
    [personClass run];
    [personClass performSelector:@selector(run)];
    objc_msgSend(personClass, @selector(run));
}
//2.测试消息机制(含参)
void text2(){
    //注意 performSelector 这个函数的传参的个数有限,一般是用字典或者数组来做这种处理
    Person * person = [[Person alloc]init];
    [person eatWith:@"包子"];
    [person performSelector:@selector(eatWith:) withObject:@"包子"];
    objc_msgSend(person, @selector(eatWith:),@"包子");
}

需要注意的是

1.运行以上代码需要导入#import <objc/message.h>

2.需要在Build Setting -> 搜索msg -> 设置属性为No(取消消息机制的检查)

以上是关于runtime:消息机制的主要内容,如果未能解决你的问题,请参考以下文章

RunTime(消息机制) + RunTime(消息转发)

揭秘 Objective-C Runtime - 消息转发

iOS开发runtime学习:一:runtime简介与runtime的消息机制

IOS-Runtime(消息机制)

iOS runtime探究: 从runtime開始深入理解OC消息转发机制

RunTime 动态消息机制