• 通过runtime替换系统类实现的代码(从github开源库fdstackview中摘录)


    其中部分代码为汇编;由此可见oc的runtime的灵活性和能力。此代码仅供参考


    // ----------------------------------------------------

    // Runtime injection start.
    // Assemble codes below are based on:
    // https://github.com/0xced/NSUUID/blob/master/NSUUID.m
    // ----------------------------------------------------

    #pragma mark - Runtime Injection

    __asm(
          ".section        __DATA,__objc_classrefs,regular,no_dead_strip "
    #if    TARGET_RT_64_BIT
          ".align          3 "
          "L_OBJC_CLASS_UIStackView: "
          ".quad           _OBJC_CLASS_$_UIStackView "
    #else
          ".align          2 "
          "_OBJC_CLASS_UIStackView: "
          ".long           _OBJC_CLASS_$_UIStackView "
    #endif
          ".weak_reference _OBJC_CLASS_$_UIStackView "
          );

    // Constructors are called after all classes have been loaded.
    __attribute__((constructor)) static void FDStackViewPatchEntry(void) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            @autoreleasepool {
                
                // >= iOS9.
                if (objc_getClass("UIStackView")) {
                    return;
                }
                
                Class *stackViewClassLocation = NULL;
                
    #if TARGET_CPU_ARM
                __asm("movw %0, :lower16:(_OBJC_CLASS_UIStackView-(LPC0+4)) "
                      "movt %0, :upper16:(_OBJC_CLASS_UIStackView-(LPC0+4)) "
                      "LPC0: add %0, pc" : "=r"(stackViewClassLocation));
    #elif TARGET_CPU_ARM64
                __asm("adrp %0, L_OBJC_CLASS_UIStackView@PAGE "
                      "add  %0, %0, L_OBJC_CLASS_UIStackView@PAGEOFF" : "=r"(stackViewClassLocation));
    #elif TARGET_CPU_X86_64
                __asm("leaq L_OBJC_CLASS_UIStackView(%%rip), %0" : "=r"(stackViewClassLocation));
    #elif TARGET_CPU_X86
                void *pc = NULL;
                __asm("calll L0 "
                      "L0: popl %0 "
                      "leal _OBJC_CLASS_UIStackView-L0(%0), %1" : "=r"(pc), "=r"(stackViewClassLocation));
    #else
    #error Unsupported CPU
    #endif
                
                if (stackViewClassLocation && !*stackViewClassLocation) {
                    Class class = objc_allocateClassPair(FDStackView.class, "UIStackView", 0);
                    if (class) {
                        objc_registerClassPair(class);
                        *stackViewClassLocation = class;
                    }
                }
            }
        });
    }

  • 相关阅读:
    Power BI for Office 365(八)共享查询
    Power BI for Office 365(七) Power BI站点
    Power BI for Office 365(六)Power Map简介
    Power BI for Office 365(五)Power View第二部分
    Power BI for Office 365(四)Power View第一部分
    Power BI for Office 365(三)Power Pivot
    Power BI for Office 365(二)Power Query
    java 继承、重载、重写与多态
    Android 热修复方案Tinker(一) Application改造
    阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
  • 原文地址:https://www.cnblogs.com/fengju/p/6173603.html
Copyright © 2020-2023  润新知