zoukankan      html  css  js  c++  java
  • 剖析执行时(让你看懂执行时)

    • 执行时机制:比較高级的特性,纯C语言
    • 实际上我们平时写的OC代码。都是转成C语言的执行时代码,执行时代码的效率更高,更直接

    Person.h

    @interface Person : NSObject
    @property(nonatomic,assign)int age;
    @end
    

    main.m

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Person *p = [[Person alloc]init];
    
            p.age = 10;
        }
        return 0;
    }
    

    我们来窥探底层对我们的这两句代码做了什么事情:

    int main(int argc, const char * argv[]) {
        /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
            Person *p = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));
    
            ((void (*)(id, SEL, int))(void *)objc_msgSend)((id)p, sel_registerName("setAge:"), 10);
        }
        return 0;
    }
    • 可能这样看起来有点乱,我略微整理一下:
      alloc,init底层就是这种:
    id pp = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
    
            Person *p = objc_msgSend(pp, sel_registerName("init"));

    事实上就是给Person这个类发送一个alloc消息,然后返回一个Person对象,再给Person这个对象,发送一个init消息。返回一个初始化完成的对象。


    我们继续看:

    objc_msgSend(p, sel_registerName("setAge:"), 10);

    这里是给Person对象发送一个setAge:消息,參数是10.


    那么我们在main中的代码,我们事实上也能够这么写:

    #import "Person.h"
    #import <objc/message.h>
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Person *p = [[Person alloc]init];
    
            objc_msgSend(p, @selector(setAge:),20);
    
            NSLog(@"%d",p.age);
    
    //        p.age = 10;
    
        }
        return 0;
    }

    然而,这个可能你们还不能看出执行时有什么优点。详细的执行时的优点,看我之前写的博客:给执行时加入属性
    执行时的常见三种使用方法

  • 相关阅读:
    启动另外一个activity,并返回结果
    MySQL5.0版本的安装图解
    android 通过Eclipse进行数字签名
    asp.net 未能写入输出文件--“拒绝访问的解决办法
    NeatUpload——支持大文件上传的控件
    ImageView的缩放模式
    开启手机LogCat
    得到Access数据库中的所有表名
    如何保护Excel工作表,不被人修改或删除指定区域
    Excel实现下拉列表选择
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7094183.html
Copyright © 2011-2022 走看看