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

  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/fusheng-it/p/5639991.html
Copyright © 2011-2022 走看看