zoukankan      html  css  js  c++  java
  • 运行时中给一个对象绑定另外一个对象

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

    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值.

  • 相关阅读:
    Running MYSQL 5.7 By Bash On Ubuntu On Windows:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
    MiniDao FreeMarker Cache 缓存问题
    Minidao FreeMarker 数组
    插入排序实例
    Binutils工具集中的一些比较常用的工具
    交叉编译工具简介
    TQ2440触摸屏
    对IIC总线时序的一点理解以及ACK和NACK(NAK)
    UART,SPI,IIC的一点理解
    linux中vi显示中文乱码的问题
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3713760.html
Copyright © 2011-2022 走看看