iOS 13 class_getMethodImplementation метод изменения - PullRequest
0 голосов
/ 05 ноября 2019

Я обнаружил, что метод class_getMethodImplementation был изменен в iOS 13.

это код в iOS 13:

libobjc.A.dylib`class_getMethodImplementation:
->  0x1b6f70a80 <+0>:  mov    x2, x0
    0x1b6f70a84 <+4>:  mov    x0, #0x0
    0x1b6f70a88 <+8>:  cbz    x2, 0x1b6f70ab8           ; <+56>
    0x1b6f70a8c <+12>: cbz    x1, 0x1b6f70ab8           ; <+56>
    0x1b6f70a90 <+16>: stp    x29, x30, [sp, #-0x10]!
    0x1b6f70a94 <+20>: mov    x29, sp
    0x1b6f70a98 <+24>: orr    w3, wzr, #0xf
    0x1b6f70a9c <+28>: mov    x0, #0x0
    0x1b6f70aa0 <+32>: bl     0x1b6f80250               ; lookUpImpOrForward
    0x1b6f70aa4 <+36>: adrp   x8, -2
    0x1b6f70aa8 <+40>: add    x8, x8, #0x580            ; =0x580 
    0x1b6f70aac <+44>: cmp    x0, #0x0                  ; =0x0 
    0x1b6f70ab0 <+48>: csel   x0, x8, x0, eq
    0x1b6f70ab4 <+52>: ldp    x29, x30, [sp], #0x10
    0x1b6f70ab8 <+56>: ret    

, а код в другой версии iOS:

libobjc.A.dylib`class_getMethodImplementation:
->  0x18457a8c4 <+0>:  mov    x8, #0x0
    0x18457a8c8 <+4>:  cbz    x0, 0x18457a900           ; <+60>
    0x18457a8cc <+8>:  cbz    x1, 0x18457a900           ; <+60>
    0x18457a8d0 <+12>: stp    x29, x30, [sp, #-0x10]!
    0x18457a8d4 <+16>: mov    x29, sp
    0x18457a8d8 <+20>: orr    w3, wzr, #0x1
    0x18457a8dc <+24>: orr    w4, wzr, #0x1
    0x18457a8e0 <+28>: orr    w5, wzr, #0x1
    0x18457a8e4 <+32>: mov    x2, #0x0
    0x18457a8e8 <+36>: bl     0x184585390               ; lookUpImpOrNil
    0x18457a8ec <+40>: adrp   x8, 22
    0x18457a8f0 <+44>: add    x8, x8, #0x5e0            ; =0x5e0 
    0x18457a8f4 <+48>: cmp    x0, #0x0                  ; =0x0 
    0x18457a8f8 <+52>: csel   x8, x8, x0, eq
    0x18457a8fc <+56>: ldp    x29, x30, [sp], #0x10
    0x18457a900 <+60>: mov    x0, x8
    0x18457a904 <+64>: ret 

и исходный код:

IMP class_getMethodImplementation(Class cls, SEL sel)
{
    IMP imp;
    if (!cls  ||  !sel) return nil;
    imp = lookUpImpOrNil(cls, sel, nil, 
                         YES/*initialize*/, YES/*cache*/, YES/*resolver*/);
    // Translate forwarding function to C-callable external version
    if (!imp) {
        return _objc_msgForward;
    }
    return imp;
}

Почему происходит такое изменение, чтобы эффективность работы была выше?

...