zoukankan      html  css  js  c++  java
  • 通过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;
                    }
                }
            }
        });
    }

  • 相关阅读:
    pycharm永久破解方法
    Django-视图&网址
    Django-初体验
    Appium+Pytest实现app并发测试
    我是如何在一周内拿到4份offer的?
    Jenkins集成allure测试报告
    Allure-pytest功能特性介绍
    requests的深入刨析及封装调用
    pytest-html报告修改与汉化
    RobotFrameWork Web自动化测试环境搭建
  • 原文地址:https://www.cnblogs.com/fengju/p/6173603.html
Copyright © 2011-2022 走看看