Blogs
Blogs copied to clipboard
关于 objc_msgSend 请教
objc 代码 编译生成 objc_msgSend 函数, 那应该是在 编译过程中产生的吧,具体是哪一步?; runtime 是不是就是个 动态库;objc_msgSend 就是runtime动态库里的方法, 最后会链接,装载成 执行文件吗?
望指教.
objc代码生成objc_msgSend是在哪一步?
是在CodeGen这一步,这一步会对Objective C的runtime进行桥接,objective c的方法会被转换为objc_msgSend函数调用。 详见:深入浅出iOS编译
runtime 是不是就是动态库?
runtime是一套Objective C运行时机制,把runtime叫做动态库是不严谨的,runtime会依赖于一些动态库,核心的是libobjc.A.dylib,在操作系统的这个目录下 /usr/lib/libobjc.A.dylib。
objc_msgSend 就是runtime动态库里的方法, 最后会链接,装载成 执行文件吗?
不会,Objective C的ABI非常稳定,所以动态库libobjc.A.dylib是iOS操作系统层面提供的,不需要打包进App。链接时,可执行文件里会写入objc_msgSend来自libobjc.A.dylib,然后App启动的时候,由dyld修复objc_msgSend函数在内存中的地址。详见:深入理解iOS App的启动过程