zoukankan      html  css  js  c++  java
  • 格而知之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

  • 相关阅读:
    解决:Server IPC version 9 cannot communicate with client version 4
    解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
    hadoop解决windows下:Failed to set permissions of path: mp .staging to 0700
    find命令的使用
    linux解决端口冲突问题
    linux中实用的小工具lrzsz
    nginx常用命令
    编写测试用例的方法
    selenium之web自动化模拟操作(窗口,鼠标,键盘,js)
    什么是面向连接服务?什么是无连接服务?它们的区别是什么?
  • 原文地址:https://www.cnblogs.com/shayneyeorg/p/5649265.html
Copyright © 2011-2022 走看看