• 格而知之8:我所理解的Runtime(3)


    关联对象

    14、使用Category对类进行拓展的时候,只能添加方法,而不适合添加属性(可以添加属性,也可以正常使用get方法和set方法,只是不会自动生成以下划线开头命名的成员变量)。

    可以通过关联对象(Associated Objects)来在Category里添加一个关联对象,然后将这个对象当做属性来看待使用,制造出“在Category中添加属性”的效果。

    (1)、假设要在NSObject类的Category中添加一个关联对象,处理方法如下:

    首先在@interface里照常添加属性associatedObject,然后在@implementation中,重写这个属性的set方法和get方法,在set方法里面使用objc_setAssociatedObject()函数关联上属性associatedObject,在get方法里使用objc_getAssociatedObject()函数获取属性associatedObject的值;

    (2)、objc_setAssociatedObject()函数的4个参数分别是;关联的源对象、key、关联对象、关联方式。

    key必须是一个唯一的常量,在上面的例子里使用了associatedObject这个方法的selector作为key,使用其他任何唯一的常量作为key也是可以的。

    关联方式相当于属性的特性,所有的关联方式罗列如下:

     

    objc_getAssociatedObject()函数的2个参数分别是:关联的源对象、key。

    这个key必须和objc_setAssociatedObject()函数李的key一样,方能取出正确的值。

    (3)、如上文一样为NSObject添加了一个关联属性后,执行以下代码:

     

    输出如下:

     

    等同于使用正常属性的效果。

    方法交换(Method Swizzling

    15、Method Swizzling可以在运行时将某个方法的实现替换成另一个方法的实现,这个技巧可以让你在不改动原方法的代码的前提下,对原方法的实现进行修改。

    以下是一个在UIViewController类里交换了viewDidAppear:方法的例子。新建一个UIViewController类的分类(命名为Logging),然后在分类里重写+load方法,如下:

     

    其中用来交换的方法命名为-swizzled_viewDidAppear:,定义如下:

     

    交换函数swizzleMethod定义如下:

     

    执行之后可以得到输出如下:

     

    发现确实执行了我们自己定义的-swizzled_viewDidAppear:方法,说明已成功交换了两个方法的实现。

    参考文档:

    官方文档

    https://github.com/samlaudev/RuntimeDemo

    www.jianshu.com/p/25a319aee33d

  • 相关阅读:
    A.2.5输入年,月,判断本月有多少天?
    A.1.2九九乘法表
    运算原理有点复杂,不懂。啊!求解释?
    A.1.1第一个输出程序“Hello World!”
    什么是 MVC ?
    要么滚回去,要么拼命
    创建Android的Hello World应用程序
    转载华硕2008年Java面试题
    Java 计算器实现
    Java 使用execute方法执行Sql语句
  • 原文地址:https://www.cnblogs.com/shayneyeorg/p/5649265.html
Copyright © 2020-2023  润新知