首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

objc_msgSend底层探索(下)

上一篇里面,我从OC层面来探索了objc_msgSend如何进行消息的发送,对普通开发者来说也是比较容易理解的,那很多人都知道,Runtime是由C或者C++以及汇编语言写的一套底层的API。...然后我打开objc源码,全局搜索objc_msgSend。 竟然有644个!看哪一个呢?我之前已经剧透了,objc_msgSend是用汇编写的,所以我来找汇编文件就可以了,按住command。...展开arm64.s文件之后,也会看到很多的objc_msgSend,如果稍微有点熟悉的话,你就会知道,在汇编里面,经常有这么一个方法,ENTRY。...这里先插一个问题,为什么objc_msgSend是用汇编写的?而不是用C/C++写呢?我刚刚随便一搜索就搜到了很多的objc_msgSend。...也就是说,源码里面包含了多个版本的objc_msgSend方法,他们是根据返回值的类型和调用者的类型分别处理的,如果说用C或者C++来实现。

17820

objC运行时所想到的。。。

objC语言不仅仅有着面向对象的特点(封装,继承和多态),也拥有类似脚本语言的灵活(运行时),这让objC有着很多奇特的功能-可在运行时添加给类或对象添加方法,甚至可以添加类方法,甚至可以动态创建类。。...objC运行时依赖objc/runtime库,通过runtime库,我们可以给类将c语言函数添加为实例方法,同理也可以修改类方法。...既然objC的runtime这么给力,那么我们可以有一个设想,就是通过objC的runtime完成一些额外的功能实现或bug修复,而且这种功能实现或bug修复的实现代码并不仅限于objC语言,可以使用动态脚本语言完成...objC层的逻辑代码,并在objC层进行代码翻译,实现具体逻辑,完成代码动态修补,这样我们可以不用等待漫长的app审核完成bug的热修复。...另外需要处理的则是js方法名到objC方法名的转换,由于objC方法是多参数类型的,因此针对“:”分隔符需要在js层做相应的转换处理。

76980

iOS - Dissecting objc_msgSend on ARM64

0x002 cbz x9, __objc_msgSend_uncached x9 包含了从 bucket 中读取的选择器,这条命令比较了它和0并且如果它不是0的话会跳转到 __objc_msgSend_uncached...0x007c adrp x10, _objc_debug_taggedpointer_classes@PAGE 0x0080 add x10, x10, _objc_debug_taggedpointer_classes...0x0090 adrp x10, _objc_debug_taggedpointer_ext_classes@PAGE 0x0094 add x10, x10, _objc_debug_taggedpointer_ext_classes...objc_msgSend 不能清除这块内存,因为它不知道返回值到底有多大。为了解决这个问题,编译器生成的代码会在调用 objc_msgSend 之前用 0 填满这块内存。...这就是 nil 处理的结尾,也是整个 objc_msgSend 的结尾。 对于 objc_msgSend() 代码有一点不够清晰就是缓存中也包含了 "负" 的缓存值来记录 misses 的缓存。

60940

objC与js通信实现--WebViewJavascriptBridge

js调用objC则有些特殊,不过依然利用stringByEvaluatingJavaScriptFromString方法实现基本通信,并在objC层针对webviewDelegate接口提供的webView...待objC接收到消息,解析responseId,执行回调函数。...层执行flushMessageQueue:messageQueueString方法,将调用命令数组序列化,并执行objC层定义的函数,这个调用的过程类似上节中objC调用js层定义的函数,也是当objC...因此综上来看,不管objC和js如何通信,最为关键的就是stringByEvaluatingJavaScriptFromString方法,它构建起了objC和js通信的基石,“objC可以直接通过该方法调用...js函数,js也可让objC通过该方法获取js的调用队列,从而在objC层执行命令”。

1.5K100
领券