剖析执行时(让你看懂执行时)

gccbuaa gccbuaa     2022-09-06     252

关键词:

  • 执行时机制:比較高级的特性,纯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;
}

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

阿昌教你看懂springmvc执行流程(代码片段)

阿昌教你看懂SpringMVC执行流程一、前言Hello呀!!!阿昌又来也╰(°▽°)╯!!!SpringMVC的执行流程大家应该都挺熟悉的,但是真的去debug源码的人应该算少数,这里阿昌一直都想自己记录一下debug-SpringMVC的执行流... 查看详情

一篇文让你看懂nb-iotloraemtcsigfox及zigbee的应用场景

转自:https://blog.csdn.net/nicholas_dlut/article/details/81051269 查看详情

4张图让你看懂分布式架构从硬件到软件

对于分布式的架构相对很多开发者都是个高大上的项目,其实只要看得懂图精通tcp通信、精通磁盘管理、精通内存管理、精通多线程与并行处理,精通事务(其实事务就是基于tcp通信层所扩展而来的MQ之类的一种IO消息模式而与... 查看详情

阿昌教你看懂mybatisplus的sql执行流程(代码片段)

...・∀・)ノ゙这一次打算记录一下sql语句的执行流程,同样还是建议打开源码一起翻着对比看比较好前戏我们以如下代码开始入手:↓publicbooleanisExist(VisitInfoTableitem)returnbaseMapper.selectCount(newQueryWrapper<VisitIn... 查看详情

阿昌教你看懂mybatisplus的sql执行流程(代码片段)

...・∀・)ノ゙这一次打算记录一下sql语句的执行流程,同样还是建议打开源码一起翻着对比看比较好前戏我们以如下代码开始入手:↓publicbooleanisExist(VisitInfoTableitem)returnbaseMapper.selectCount(newQueryWrapper<VisitIn... 查看详情

线程详细剖析

摘自《C++多核编程》6.2 线程和进程的比较线程和进程都能够提供并发程序执行。当您决定使用多个进程还是多个线程时,上下文切换需要使用的系统资源、吞吐量、实体间通信、程序简化等都是需要考虑的问题。6.2.1上下文... 查看详情

全干货5分钟带你看懂docker!

...语:Docker,近两年才流行起来的超轻量级虚拟机,它可以让你轻松完成持续集成、自动交付、自动部署,并且实现开发环境、测试环境、运维环境三方环境的真正同步。本文从Docker定义,作用,技术架构,安装和使用等全方位带... 查看详情

经典10046剖析案例-3

执行计划+Hint+统计信息+并行+绑定变量+sql跟踪和10046事件+10053事件总结  执行计划1.执行计划中的rows表示CBO从一个行源预期获取的记录数,这个行源可能是一个表,也可能是一个索引。2.rows值对CBO做出正确的执行计划至关... 查看详情

trycatchfinally语句块中存在return语句时的执行情况剖析(代码片段)

2种场景(1)try中有return,finally中没有return(注意会改变返回值的情形);(2)try中有return,finally中有return;场景代码分析(idea亲测)场景一:1//实例一:try中有return,finally中没有return2publicclassTryReturnFinally3publicstaticvoidmain(String[]args)4System.out.printl... 查看详情

线程详细剖析

摘自《C++多核高级编程》6.1什么时线程线程时进程中可执行代码流的序列,它被操作系统调度,并在处理器或内核上运行。所有的进程都有一个主线程(primarythread)。主线程时进程的控制流或执行线路。具有多个线程的进程拥... 查看详情

一分钟带你看懂公有云和私有云的区别

...著差别在于对数据的掌控。只需一分钟,下面几张图就能让你看懂公有云和私有云的本质区别。私有云和公有云的显著差别在于对数据的掌控。采用公有云服务的企业必须将数据托管于云服务商的数据中心,企业对数据的掌控力... 查看详情

当他执行错误命令时,从声音中踢出作者信息

】当他执行错误命令时,从声音中踢出作者信息【英文标题】:Kicksauthormessagefromthevoicewhenhedoesabadcommand【发布时间】:2021-07-0422:46:42【问题描述】:大家好!我想要一个代码,如果一个叫“A”的人没有按预期执行命令,只是从... 查看详情

java中的finally

...包含return语句时,finally语句是在return之前执行的;深度剖析请看https://www.ibm.com/developerworks 查看详情

一图看懂mybatis执行过程

一图看懂mybatis执行过程,不再懵B了 查看详情

用几张图深度剖析java运行时数据区(代码片段)

(一)基础概念介绍首先看一张图:下图是Java虚拟机运行时数据区,JVM的内存模型可以分为方法区、虚拟机栈、本地方法栈、堆和程序计数器。首先还是介绍一下基本概念程序计数器:程序计数器的作用可以... 查看详情

springmvc源码剖析-springmvc执行流程(代码片段)

前言上一篇文章写得是SpringMVC组件初始化,这篇文章我们来探讨一下SpringMVC的执行流程SpringMVC执行流程SpringMVC执行流程几乎是在面试时面试官对SpringMVC部分的必问之题,下面是SpirngMVC的执行原理图这个是请求在SpringMVC的... 查看详情

django在单进程中使用scheduler时只有一个任务,但是会出现多条执行(代码片段)

...时任务时,发现我只设置了一个任务,但是去看执行记录,发现有多个job同时工作。 这个任务,我设置了1分钟执行一次,但是你看执行记录上,1分钟执行了多次 解决方法:加上replace_existing=True&#x... 查看详情

进程详细剖析

摘自《C++多核高级编程》5.6.3 进程状态在进程执行期间,它的状态会发生改变。进程的状态时指进程的当前状况。在POSIX兼容的环境中,进程可以处于以下状态:1)运行(running)2)就绪(runnable,ready)3)僵死(zombied)4)等待(wait... 查看详情