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

  • 相关阅读:
    【ASP.Net MVC】在AspNet Mvc使用JQuery AutoComplete组件
    Jquery AutoComplete的使用方法实例
    .Net使用Redis详解之ServiceStack.Redis(七)
    Redis系列之key操作命令与Redis中的事务详解(六)
    Redis数据结构详解之Zset(五)
    redis数据结构详解之Hash(四)
    Redis数据结构详解之Set(三)
    Redis数据结构详解之List(二)
    Redis数据结构详解(一)
    WCF配置文件详解(一)
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3713760.html
Copyright © 2011-2022 走看看