管理关联对象和NSDictionary区别

一、问题引出

为类添加关联对象:

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

为NSDictionary添加对象:

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

objc_setAssociatedObject可以理解为给object对象(NSDictionary),采用policy策略添加key-value记录。

二、区别

1、方法入参数中的key,分别是不透明指针和对象。对象只用调用isEqual:方法返回YES,NSDictionary视为同一记录。而不透明指针必须是完全相同的指针,才能找到同一个关联的对象。

2、基于第一点,objc_setAssociatedObject的入参key,必须是静态全局变量,如static void *associatedKey = "associatedkey";

时间: 2024-10-09 06:39:12

管理关联对象和NSDictionary区别的相关文章

Effective-OC 10.在既有类中使用关联对象存储自定义数据

EOC中介绍与案例 有时候需要在对象中存放相关的信息 这时候我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象.然而并非所有的情况都能这么做.有的时候 类的实例可能是由某种机制创建的,而开发者无法令这种机制创建出自己写的子类的实例,OC中有一强大的特性可以解决这个问题 就是"关联对象" 可以给某对象关联许多其他的对象 这些对象通过"键"来区分.存储对象值得实惠 可以指明"存储策略",用以维护相对应的"内存管理语义".

AssociatedObject关联对象原理实现

介绍 关联对象(AssociatedObject)是Objective-C 2.0运行时的一个特性,允许开发者对已经存在的类在扩展中添加自定义的属性.在实际生产过程中,比较常用的方式是给分类(Category)添加成员变量. 例子 #import <objc/runtime.h> @interface NSObject (AssociatedObject) @property (nonatomic, strong) id property; @end @implementation NSObj

第10条:在既有类中使用关联对象存放自定义数据

在对象中存放相关信息的方式: 1.从对象所属的类中继承一个子类,然后改用这个子类对象. 然而有时类的实例可能是由某种机制所创建的,无法使用这种机制创建自己所写的子类实例.所以采用第2种方式-----“关联对象” 2.关联对象 可以给某对象关联多个对象,这个对象用“键”来区分,存储对象值的时,可以指明“存储策略”.存储策略由名为objc_AssociationPolicy的枚举所定义. 对象的关联类型: OBJC_ASSOCIATION_ASSIGN     等价于  assign OBJC_AS

《Effective Objective-C 2.0》—(第6-10条)—对象、属性、equalToString、关联对象

用OC等面向对象语言编程时,"对象"(object)就是"基本构造单元"(building block),开发者可以通过对象来存储并传递数据.在对象之间传递数据并执行任务的过程就叫做"消息传递"(Messaing). 当应用程序运行起来以后,为其提供相关支持的代码叫做"Objective-C运行期环境"(Objevtive-C runtime),它提供了一些使得对象之间能够传递消息的重要函数,并且包含创建类实例所用的全部逻辑.

MyBatis之ResultMap简介,关联对象

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在.在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值.当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resul

hibernate关联对象的增删改查------查

本篇博客是之前博客hibernate关联对象的增删改查------查 的后继,本篇代码的设定都在前文已经写好,因此读这篇之前,请先移步上一篇博客 //代码片5 SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); session.beginTransa

iOS runtime实战应用:关联对象

在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇到这样一个问题:"如何給NSArray添加一个属性(不能使用继承)",筒子立马蒙逼了,不能用继承,难道用分类?但是分类貌似只能添加方法不能添加属性啊,筒子百思不得其解,直到后来接触到了runtime才恍然大悟. 什么是关联对象 关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上.举个例子:xiaoming是Person类的一个实例,他的dog(一个OC对象)通过一根

使用Hibernate映射多对多关联关系时,是否需要创建关联对象的总结

最近在做一个CMS管理项目,在RBAC模型创建时,遇到一个小疑问. 我们知道使用Hibernate可以使用many-to-many的注解或xml配置来自动完成多对多映射,例如:User Role Group三个对象,以User和Group为例. 在数据库表中必然存在一个t_user_group的table表,使用Hibernate完全可以在不建立UserGroup对象的情况就完成级联添加.删除.查询等操作. 目前来看,我们在实体模型中是没有必要创建UserGroup这个关联对象的. 但是如果遇到

QtQuick桌面应用开发指导 3)实现UI和功能_B 4)动态管理Note对象_A

3.2 把Page Item和Marker Item绑定 之前我们实现了PagePanel组件, 使用了三个state来切换Page组件的opacity属性; 这一步我们会使用Marker和MarkerPanel组件来实现页面导航; 在原型阶段, MarkerPanel组件十分简单, 没有任何功能; 它使用了Repeater类型来产生三个QML Item以及Marker组件作为delegate; MarkerPanel应该存储当前激活的marker(标记), 即那个被用户点击的marker; 基