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

简介:

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

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

目录
相关文章
|
12天前
|
设计模式
在静态方法中访问类的实例属性和方法时会发生什么?
总之,静态方法主要用于处理与类本身相关的操作和逻辑,不应该直接访问类的实例属性和方法。如果需要在静态方法中使用与实例相关的信息,应该通过合理的参数传递或其他设计模式来实现,以保持代码的清晰性和面向对象设计的原则。
40 8
|
6天前
|
搜索推荐
如何在构造函数中为类的实例添加方法?
在实际开发中,要根据具体的场景和需求来选择合适的方式来为类的实例添加方法,以确保代码的可读性、可维护性和性能。
|
6月前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
79 4
|
6月前
|
存储 Java
|
6月前
|
前端开发 算法 JavaScript
检查是否是类的对象实例
检查是否是类的对象实例
50 0
|
安全 编译器 数据安全/隐私保护
对象的动态创建和销毁以及对象的复制,赋值
🐰对象的动态创建和销毁 🐰对象的复制 🐰对象的赋值
|
设计模式 SQL Java
调用MapperProxy对象|学习笔记
快速学习调用MapperProxy对象
188 0
调用MapperProxy对象|学习笔记
|
Java 编译器
创建一个对象的时候
创建一个对象的时候
77 0
|
缓存 安全 Java
仅且仅创建一次对象
此篇算是对《voliatile,synchronized,cas》理论的一种实践
155 0