通过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\n"
#if    TARGET_RT_64_BIT
      ".align          3\n"
      "L_OBJC_CLASS_UIStackView:\n"
      ".quad           _OBJC_CLASS_$_UIStackView\n"
#else
      ".align          2\n"
      "_OBJC_CLASS_UIStackView:\n"
      ".long           _OBJC_CLASS_$_UIStackView\n"
#endif
      ".weak_reference _OBJC_CLASS_$_UIStackView\n"
      );

// 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))\n"
                  "movt %0, :upper16:(_OBJC_CLASS_UIStackView-(LPC0+4))\n"
                  "LPC0: add %0, pc" : "=r"(stackViewClassLocation));
#elif TARGET_CPU_ARM64
            __asm("adrp %0, L_OBJC_CLASS_UIStackView@PAGE\n"
                  "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\n"
                  "L0: popl %0\n"
                  "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;
                }
            }
        }
    });
}

时间: 2024-09-15 11:22:48

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

java-1Java的问题多个类怎么写代码呢。

问题描述 1Java的问题多个类怎么写代码呢. 就是在eclipse中写建立一个Java工程,有两个类,把代码打进去了,为啥运行不了呢,要分别建立类吗,分别建立的类就是打与其相关的额那一部分就可以了吗,主类中要把其中他的 类中的内容放进去吗 解决方案 对于public类型的类,必须和文件名同名,一个java文件写一个.private和内部类可以直接写在同一个文件内. 解决方案二: 如果你想要在主函数中调用其他类的内容,你先要定义该类的对象来调用该类的成员(属性.方法等),另外你的问题描述的不是很

批处理之家发现的用批处理实现的系统类应用代码_DOS/BAT

批处理之家发现的用批处理实现的系统类应用代码 比如菜单的排序,就用到不一样的方法 还有输出的方式等...... 大家用了就知道 写的不好.还请大家多多指教. 由于代码过长,请下载附件. 回帖是美德,下了就要顶啊   bat......右键bat LJ....清理LJ文件  ZCB...查看启动项     JC......查看进程 MIM...通密码管理  IP....查看IP配置    sys.....系统信息 dir.....诊断工具  JH....组策略结集    zcb.......注册表

iOS开发之使用Runtime给Model类赋值

本篇博客算是给网络缓存打个基础吧,本篇博客先给出简单也是最容易使用的把字典转成实体类的方法,然后在给出如何使用Runtime来给Model实体类赋值.本篇博客会介绍一部分,主要是字典的key与Model的属性名相同时,使用Runtime来进行赋值,下篇博客会给出字典key的值和Model的名字不同时的解决方案,并给出使用Runtime打印实体类属性值的方式. 当然你可以使用KVC的setValuesForKeysWithDictionary:方法,下面的方法也是一种解决方案.如果使用setVal

浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)_php实例

php关键词替换的类(避免重复替换,保留与还原原始链接) 本节主要内容: 一个关键词替换的类 主要可以用于关键词过滤,或关键词查找替换方面. 实现过程分析: 关键词替换,其实就是一个str_replace()的过程,如果是单纯的str_replace面对10W的关键词,1W字的文章也只需要2秒左右. 问题所在: 关键词替换了不只一次,比如a需要替换成<a>a</a>,但结果可能是<a><a>a</a></a>等这样. 为此,需要一个方

iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name相同,然后通过运行时来生成和执行Setter方法给Model类的属性赋值. 通过Runtime来给Model类属性赋值的好处是多多的,它便于代码的后期维护,并且提高了开发效率.当你拿到解析后的字典时你不用一个一个的通过key去把字典的值赋值给相应的Model类的属性,本篇博客中会给出如何去遍历Mod

Win7系统蓝屏提示代码错误“win32k.sys”怎么办?

Win7系统蓝屏提示代码错误"win32k.sys"怎么办?   出现这样的情况,一般是由于病毒侵犯或者系统文件缺陷导致的.下面系统盒小编就给大家分享下解决方法. 步骤: 1.从其他Win7系统中拷贝一份"win32k.sys"文件到U盘中,路径为:C:WindowsSystem32 2.然后该文件复制到出问题电脑中的C:WindowsSystem32 目录下,在弹出是否替换界面内选择"是"即可解决.

用以替换系统NSLog的YouXianMingLog

用以替换系统NSLog的YouXianMingLog 这是本人自己使用并改良的用以替换系统NSLog的类,非常好用,以下是使用示例,现在开源出来并提供源码,好用的话顶一下吧^_^ 效果: YouXianMingLog.h 与 YouXianMingLog.m // // YouXianMingLog.h // // http://home.cnblogs.com/u/YouXianMing/ // https://github.com/YouXianMing // // Created by Y

系统蓝屏的代码详解_其它相关

系统蓝屏代码全集 00000001 不正确的函数. 2 0×00000002 系统找不到指定的档案. 3 0×00000003 系统找不到指定的路径. 4 0×00000004 系统无法开启档案. 5 0×00000005 拒绝存取. 6 0×00000006 无效的代码. 7 0×00000007 储存体控制区块已毁. 8 0×00000008 储存体空间不足,无法处理这个指令. 9 0×00000009 储存体控制区块地址无效. 10 0×0000000A 环境不正确. 11 0×00000

php 批量替换程序的具体实现代码_php实例

代码如下: 复制代码 代码如下: <?php/***************************************************************************batch-replace, v1.1***************************************************************************file: batch-replace_utf8.phpfunctionality: 本程序可以扫描指定目录的所有文