zoukankan      html  css  js  c++  java
  • 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(取消消息机制的检查)

  • 相关阅读:
    仓位管理 – 1.理论篇
    作为首席架构师,我是如何选择并落地架构方案的?
    asp.net MVC 应用程序的生命周期
    微服务架构优缺点
    一位同事对 Rafy 框架的一些建议及我的回复
    .NET 版本区别,以及与 Windows 的关系
    MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)
    何时使用静态 API
    2011奥斯卡最佳纪录片《监守自盗(Inside Job)》小结
    Rafy 框架
  • 原文地址:https://www.cnblogs.com/fusheng-it/p/5639991.html
Copyright © 2011-2022 走看看