运行时中给一个对象绑定另外一个对象
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值.