美文网首页
探索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语言

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