• 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(取消消息机制的检查)

  • 相关阅读:
    vue 使用echarts 柱状图使用图片显示
    Devexpress分组小计
    小写转大写
    预览打印
    LINQ
    结束任务管理器进程
    游标
    查看死锁
    sql 分页
    压缩解压缩传输的数据
  • 原文地址:https://www.cnblogs.com/fusheng-it/p/5639991.html
Copyright © 2020-2023  润新知