`

[#0x0032] Pointer Swizzling

Go 
阅读更多

  继续学习。pointer swizzling有个很坏的翻译叫“指针混写”,翻译得不知所云。

  以下来自Jargon File和Wikipedia。

 

  To convert external names, array indices, or references within a data structure into address pointers when the data structure is brought into main memory from external storage; this may be done for speed in chasing references or to simplify code (e.g., by turning lots of name lookups into pointer dereferences). The converse operation is sometimes termed ‘unswizzling'.

 

  Jargon File的这一段解释得还是不怎么清楚,看Wikipedia上的这个例子就很清楚了。

 

  In computer science, pointer swizzling is the conversion of references based on name or position to direct pointer references. It is typically performed during the deserialization (loading) of a relocatable object from disk, such as an executable file or pointer-based data structure. The reverse operation, replacing pointers with position-independent symbols or positions, is sometimes referred to as unswizzling, and is performed during serialization(saving).

 

  For example, suppose we have the following linked list data structure:

struct node {
        int data;
        struct node *next;
};

  We can easily create a linked list data structure in memory using such an object, but when we attempt to save it to disk we run into trouble. Directly saving the pointer values won't work on most architectures, because the next time we load it the memory positions the nodes now use may be in use by other data. One way of dealing with this is to assign a unique id number to each node and then unswizzle the pointers by turning them into a field indicating the id number of the next node:

struct node_saved {
        int data;
        int id_number;
        int id_number_of_next_node;
};

  We can save these records to disk in any order, and no information will be lost. Other options include saving the file offset of the next node or a number indicating its position in the sequence of saved records.

 

  When we go to load these nodes, however, we quickly discover that attempting to find a node based on its number is cumbersome and inefficient. We'd like our original data structure back so we can simply follow next pointers to traverse the list. To do this, we perform pointer swizzling, finding the address of each node and turning the id_number_of_next_node fields back into direct pointers to the right node.

 

  简单地说来,就是内存中的节点间通过“逻辑”指针(实质是内存地址)连接,而将这些节点保存到磁盘时,“逻辑”指针就没有任何意义了,需要变换一种方式来表示这些节点间的连接关系(这里也不好叫做“物理”指针……),这个变换的过程称为unswizzling。反过来,将这些节点从磁盘load到内存中时的变换就是swizzling。

分享到:
评论

相关推荐

    UIViewController+Swizzling 实现页面统计

    为了实现这一目标,一种常见的技术手段是利用Objective-C的Method Swizzling(方法替换)。本篇文章将深入探讨如何通过`UIViewController+Swizzling`来实现在不修改原有代码的情况下,对页面视图控制器的生命周期...

    iOS Method Swizzling

    **iOS Method Swizzling** 在iOS开发中,Method Swizzling是一种非常强大的技术,它允许开发者在运行时替换类的任何方法实现。这种方法交换是通过Objective-C的动态性来实现的,使得我们可以在不修改原有代码的情况...

    Method Swizzling示例

    **方法交换(Method Swizzling)详解** 在iOS和Mac OS X开发中,Objective-C作为主要的编程语言,提供了一种独特且强大的特性——方法交换(Method Swizzling)。它允许我们在运行时修改类的方法实现,这一特性在...

    Mehod Swizzling实现页面统计功能

    **Method Swizzling 实现页面统计功能** 在iOS开发中,我们常常需要对应用程序中的页面浏览情况进行统计,以了解用户的行为模式、优化用户体验或进行数据分析。Method Swizzling 是 Objective-C 运行时(Runtime)...

    Method Swizzling 和 AOP 实践1

    Method Swizzling 是Objective-C编程中的一种黑魔法技巧,它允许我们在运行时动态地改变方法的实现。这种方法在解决特定问题时非常有用,特别是在需要在不修改原有代码的情况下增强或扩展对象的行为时。在本篇文章中...

    swift-AopTestDemo:iOS埋点统计方案:1.MethodSwizzling2.AOP编程

    本示例项目"swift-AopTestDemo:iOS埋点统计方案"聚焦于两种常见的实现方法:Method Swizzling(方法替换)和Aspect-Oriented Programming(面向切面编程)。以下是对这两种技术的详细介绍。 **方法替换(Method ...

    移动 App 性能监测实践.pdf

    Method Swizzling是一种运行时方法替换的技术,它可以让我们在不修改原类源代码的情况下,替换某个类的方法实现。其核心原理是对Objective-C的`Method`结构体进行操作。 **基本步骤** 1. **添加“代理方法”**:...

    iOS之presentViewController模态全屏适配解决方案.docx

    #pragma mark - Swizzling - (void)override_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^ __nullable)(void))completion{ if(@available(iOS ...

    OCMethodTrace:跟踪任何Objective-C方法调用

    Objective-C方法调用跟踪涉及到两个主要概念:`method swizzling`和`NSInvocation`。 #### 1. Method Swizzling(方法交换) 方法交换是Objective-C中的一个高级特性,它允许在运行时动态地改变类的方法实现。通过...

    tex-swizzle.rar_little

    例如,整数0x12345678在小端系统中会按照0x78, 0x56, 0x34, 0x12的顺序存储。在读取这样的数据时,需要进行适当的字节重排,以确保在大端字节序系统或处理器上正确解析。 纹理Swizzling通常涉及到GPU编程,尤其是...

    Method_Swizzling:方法交叉和AOP编程的小例子,仅供参考

    在iOS和Mac开发中,Objective-C是一门广泛使用的编程语言,它提供了许多强大的特性,其中之一就是Method Swizzling。Method Swizzling是一种运行时技术,允许开发者修改类的方法实现,即在程序运行时动态替换一个...

    MethodSwizzling:根据简书中的文章,写了一个Method Swizzling的小例子。希望各位能帮忙点个Star,谢谢!

    在简书的文章中详细的讲解了Method Swizzling,为了方便大家学习和理解,所以在Github上写了这个小Demo,可以帮助大家更好的理解Method Swizzling。 在Demo中简单实现了一个崩溃拦截的代码,等以后有时间的话,我...

    详解iOS Method Swizzling使用陷阱

    在阅读团队一项目源码时,发现Method Swizzling的写法有些瑕疵。这篇文章主要就介绍iOS Method Swizzling的正确写法应该是什么样的。 下面是iOS Method Swizzling的一种实现: + (void)load { Class class = [self...

    iOS 11 使用两种方法替换(Method Swizzling)去掉导航栏返回按钮的文字

    iOS 11 使用 Method Swizzling 去掉导航栏返回按钮的文字 在 iOS 11 中,去掉导航栏返回按钮的文字是一个常见的需求,特别是在设计上需要隐藏返回按钮的文字时。这种需求可以通过 Method Swizzling 来实现,Method ...

    WebPImageSerialization:完整的iOS WebP支持,带有函数,NSJSONSerialization样式类和(可选)UIImage Swizzling

    要选择退出此行为, WEBP_NO_UIIMAGE_INITIALIZER_SWIZZLING在构建环境中设置WEBP_NO_UIIMAGE_INITIALIZER_SWIZZLING 。 如果您使用的是CocoaPods,则可以将此构建设置添加到Podfile : post_install do | r | r . ...

    Method-Swizzing:代码中有详细的Method-Swizzing 功能介绍

    在Objective-C编程中,Method-Swizzling是一种强大的技术,它允许开发者在运行时修改类的方法实现。这种方法主要用于调试、AOP(面向切面编程)和扩展已有API的行为。下面将详细介绍Method-Swizzing的工作原理、如何...

    swift-KVC的底层实现

    本文将深入探讨Swift KVC的底层实现,特别是涉及的`isa-swizzling`技术。 ### 1. KVC概述 KVC的主要思想是通过键(key)来查找并操作值(value)。它提供了一种动态访问和修改对象属性的方式,即使这些属性没有...

    Android-Method-Swizzling

    Android方法混乱 Android Studio从位于/build/outputs/aar/.aar下的模块生成aar文件 从aar提取jar文件:使用存档管理器时打开aar,而aar文件包含classes.jar文件。 一旦classes.jar文件包含所有需要的* .class文件,...

    plpatchmaster:用于 Objective-C 的实验性基于块的 swizzling API

    PLPatchMaster PLPatchMaster 提供了一个易于使用的基于块的 API,使用了提供的块蹦床库,以及一组用于 ARMv7、ARMv7s、ARM64 和 x86-64 的自定义汇编蹦床。 PLPatchMaster 可以通过注册 dyld 图像事件的侦听器,...

    Runtime面试题.pdf

    在运行时,可以利用动态特性,通过selector找到对应的IMP,并通过method swizzling技术替换掉原来的IMP,达到挂钩的目的。交换方法的实现可以通过method_exchangeImplementations,class_replaceMethod或method_set...

Global site tag (gtag.js) - Google Analytics