美文网首页
探索Objective-C对象调用方法最终生成C语言

探索Objective-C对象调用方法最终生成C语言

作者: Jniying | 来源:发表于2020-06-15 23:44 被阅读0次

OC 对象调用实例方法的时候最终都会转为 objc_msgSend
例如在viewController 对象调用如下方法:

[self testString:@"哈哈" intValue:100 stringValue:@"溜溜"];

在实例对象调用的时候会被转为

objc_msgSend(self,@selector(testString:intValue:stringValue:),@"哈哈",100,@"溜溜");

在arm64架构显示汇编如下:

LLDB_stady`objc_msgSend:
->  0x1000f2978 <+0>: nop    
    0x1000f297c <+4>: ldr    x16, #0x16b4              ; (void *)0x0000000196d75bc0: objc_msgSend
    0x1000f2980 <+8>: br     x16

在arm64架构查看寄存器

(lldb) register read
General Purpose Registers:
        x0 = 0x0000000154549790
        x1 = 0x00000001000f2b08  "testString:intValue:stringValue:"
        x2 = 0x00000001000f4078  @
        x3 = 0x0000000000000064
        x4 = 0x00000001000f4098  @
        x5 = 0x000000016fd11c40
        x6 = 0x0000000000000000
        x7 = 0x0000000000000250
        x8 = 0x00000001000f4078  @
        x9 = 0x00000001000f4098  @
       x10 = 0x00000001000f4f08  "testString:intValue:stringValue:"
       x11 = 0x0000000154549790
       x12 = 0x0028be000028be00
       x13 = 0x0000000000000000
       x14 = 0x0000000022a28888
       x15 = 0x0000000154600000
       x16 = 0x000000019779564c  libsystem_pthread.dylib`pthread_mutex_unlock
       x17 = 0x00000001878b3500  UIKit`-[UIViewController viewDidLoad]
       x18 = 0x0000000000000000
       x19 = 0x000000019e05ffe0  UIKit`_UIApplicationLinkedOnVersion
       x20 = 0x0000000154549790
       x21 = 0x00000001882055fc  "countByEnumeratingWithState:objects:count:"
       x22 = 0x000000018820586a  "count"
       x23 = 0x000000019d3a8000  UIKit`_UIFocusEngine._smallSoundPool
       x24 = 0x0000000000000000
       x25 = 0x0000000000000010
       x26 = 0x0000000000000001
       x27 = 0x0000000000000018
       x28 = 0x0000000000000000
        fp = 0x000000016fd11e40
        lr = 0x00000001000f2370  LLDB_stady`-[ViewController viewDidLoad] + 116 at ViewController.m:69:1
        sp = 0x000000016fd11e20
        pc = 0x00000001000f2978  LLDB_stady`symbol stub for: objc_msgSend
      cpsr = 0x60000000

查看具体参数

(lldb) po 0x0000000154549790
<ViewController: 0x154549790>

(lldb) po $x0
<ViewController: 0x154549790>
 x1 = 0x00000001000f2b08  "testString:intValue:stringValue:"
(lldb) po $x2
哈哈
(lldb) po $x3
100
(lldb) po $x4
溜溜
总结:方法在被实例对象调用的时候,寄存器x0 存放的是实例对象,x1存放被调用的方法,参数往后的寄存器按顺序排放

相关文章

  • 探索Objective-C对象调用方法最终生成C语言

    在OC 对象调用实例方法的时候最终都会转为 objc_msgSend例如在viewController 对象调用如...

  • Runtime之消息发送

    调用对象的方法,在Objective-C中叫做传递消息,先来看一下C语言中的函数调用方式 C语言中的函数调用方式 ...

  • iOS运行时RunTime详解

    Objective-C语言是扩展于C语言的一种面向对象的编程语言,然而其方法的调用方式又和大多数面向对象语言大有不...

  • runtime基础之结构体

    Objective-c是基于C语言的,其实意思就是Objective-c的语法最终会被编译器转化成C语言来调用,所...

  • iOS之消息传递机制

    在Objective-C中使用对象调用方法非常普遍。用Objective-C的术语来讲,这叫做“给某个对象发...

  • JSPatch通过 JS 调用和改写 OC 方法

    最根本的原因:OC 是动态语言,OC 上所有方法的调用/类的生成都通过 Objective-C Runtime 在...

  • JSPatch原理学习

    基础原理 OC为动态语言,OC上所有的方法调用/类的生成都通过Objective-C Runtime在运行时进行,...

  • 【iOS】objc_msgSend

    Objective-C 中对象调用方法叫做“传递消息”,给某对象发送消息相当于在该对象上调用消息方法。消息有“名称...

  • Runtime消息机制

    什么是Runtime 在对象上调用方法是Objective-C中经常使用的功能,用Objective-C的术语来说...

  • 深入理解 Objective-C 的方法调用流程

    我们知道,Objective-C 的方法调用不同于其他编程语言。在 Objective-C 中,所有的 [rece...

网友评论

      本文标题:探索Objective-C对象调用方法最终生成C语言

      本文链接:https://www.haomeiwen.com/subject/foykxktx.html