• 运行时中给一个对象绑定另外一个对象


    运行时中给一个对象绑定另外一个对象

    category中,如果想要添加一个属性,通常的做法是不可能的.我们都知道,category只能增加方法,不能增加属性.

    但在运行时中我们可以动态的绑定一个对象.

    有以下两个方法来绑定以及获取绑定的对象:

    objc_setAssociatedObject 

    Sets an associated value for a given object using a given key and association policy.

    给一个指定的对象关联上一个值以及设置一个关联的策略.

    objc_getAssociatedObject 

    Returns the value associated with a given object for a given key.

    根据给定的一个值返回关联的值.

    我们来用最简单的例子来测试一下,新建类A以及类B,我们让类B的一个实例关联上类A.

    A.h + A.m

    #import <Foundation/Foundation.h>
    
    @interface A : NSObject
    
    @end
    #import "A.h"
    
    @implementation A
    
    @end

    B.h + B.m

    #import <Foundation/Foundation.h>
    
    @interface B : NSObject
    
    @end
    #import "B.h"
    
    @implementation B
    
    - (void)dealloc
    {
        NSLog(@"B dealloc");
    }
    
    @end

    然后写如下的代码:

    当a被释放的时候,B类的这个实例也被释放了,上图打印信息 B dealloc 就能看出来.

    b对象是否被a对象强引用了呢?

    我们可以用如下方式来验证:

    发现并无打印信息,我们再来试试下面的方式:

    这个例子已经足以证明a对象对b对象强引用了.

    知道了这点,我们就对这两个方法进行简单的封装:

    RuntimeConnection.h + RuntimeConnection.m

    我们来给一个People类,通过category的方式添加一个新的属性.

    People类的category.

    以下为使用情况:

    总结:

    对象a  --(通过一个key值)关联--> 对象b

    对象a  --(通过一个key值)取出--> 对象b

    注意:不同的对象可以对应一个key值.

  • 相关阅读:
    Android简易抽屉效果
    apk 下载并自动安装
    python2.7_1.3_获取远程设备的IP地址
    python2.7_1.2_打印设备名和IPv4地址
    python2.7_1.14_编写一个简单的回显客户端/服务器应用
    python2.7_1.13_编写一个SNTP客户端
    C语言程序转换为Python语言
    5分钟弄懂Docker!
    让正则表达式变简单(PythonVerbalExpressions)
    python sqlalchemy-migrate 使用方法
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3713760.html
Copyright © 2020-2023  润新知