Objective-C 关联
在项目开发中,经常会使用到关联,就是将两个实例对象绑定,使得其中一个实例对象成为另一个实例对象的一部分。关联特性在mac os 10.6 及ios 3.1以上才可以使用。
关联的使用是基于关键字来实现,也就是说一个对象可以使用不同的关键字来实现随意多的关联。另外关联可以保证被关联者在关联对象的生命周期中都可以使用。
对于关联的使用,分为创建关联,获取关联对象,解除关联。下面我就会对于以上三个环节进行相应的讲解。
1.创建关联
在使用关联的时候,是需要引用#import <objc/runtime.h> 头文件(运行时函数),在创建关联的时候是使用objc_setAssociatedObject来实现的。
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。
关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。分为:OBJC_ASSOCIATION_ASSIGN ,OBJC_ASSOCIATION_RETAIN_NONATOMIC ,OBJC_ASSOCIATION_COPY_NONATOMIC,OBJC_ASSOCIATION_RETAIN , OBJC_ASSOCIATION_COPY 。实例如下:
static char overviewKey;
NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];
NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
以上代码就将array和overview关联在一起。创建完关联,我们会在其它的地方要通过overviewKey来获取overview,那接下来,我们要分析分析,我们该怎么样来通过overviewKey来获取overview。
2.获取关联对象
获取相关联的对象时使用Objective-C函数objc_getAssociatedObject(id object, const void *key),对应的参数就是关联者和关联关键字。代码实例如下
NSString *overview = objc_getAssociatedObject(array,overviewKey);
3.断开关联
断开关联有两种方法,首先,断开所有的关联我们可以采用objc_removeAssociatedObjects方法。基本上不大建议这种方法,因为这种方法将该对象的其它的相应的关联也给断开了,在项目中应用可能会带来一些以外的bug,并且可能调试起来比较麻烦。那我们平时需要做的就是通过什么关键字段来建立的关联,我怕们就应该断开我们创建的关联。那这种方法我们使用的是objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);我们给关联者关联一个nil值。关联策略无所谓,问题都不大。
以上是我在项目中使用的一些心得,基本上能够满足一般的项目需求。
Objective-C 关联的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- 【iOS】关联属性存取数据
有时候我们需要在现有的类存放一些额外的信息,通常的做法是继承一个子类,然后定义新增加的属性,然而如果我们为每个需要的类都添加一个类显得太麻烦了,objc提供了一个关联属性的特性,可以给一个对象关联一个 ...
- Objective C Runtime 开发介绍
简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...
- Hibernatel框架关联映射
Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- UML类图(下):关联、聚合、组合、依赖
前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...
- Entity Framework 6 Recipes 2nd Edition(12-5)译 -> 自动删除相关联实体
12-5. 自动删除相关联实体 问题 当一个实体被删除时,你想自动删除它相关联的实体 解决方案 假设你有一个表结构由一个course (科目), course 的classes (课程),以及enro ...
- hibernate多对一单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- 使用id名称和name直接获取元素
我们知道一些第三方的js库对如何快速选取html中的元素做了一些简化,貌似十分高深莫测,其实也不然.而且js本身自带了对于特殊元素的简便选取的方法,下面就为大家简单介绍下. 在html中,一般最直接的 ...
- expense KK [ɪkˋspɛns] DJ [iksˋpens]
https://tw.dictionary.yahoo.com/dictionary?p=expense expense 1 Dr.eye譯典通 KK [ɪkˋspɛns] DJ [iksˋpen ...
- 半小时快速了解redis,基于ubuntu 12.04 + redis 2.8.9
一.什么是redis ? 其官方介绍是: Redis is what is called a key-value store, often referred to as a NoSQL databas ...
- Spring Framework 笔记(一):IoC
一:Spring中重要的概念 1. 容器( container ) : spring容器( ApplicationContext )的工作原则是创建容器中的组件( instance ),处理组件之间的 ...
- eclipse如何安装cdt
原文地址:http://zhidao.baidu.com/link?url=9vSDAkpKJjLIIXP9wFqfjTSf-PmrEr9excDc-A3rzRh46jgzzbud0Z7gzjfxT8 ...
- android json解析详细介绍之gson
废话不多说,什么json是轻量级数据交换标准:自己百度去深入了解:这里有三种json解析工具.本人只用过其中两种: 1.Google Json利器之Gson 评价:简单,方便. 2.阿里巴巴 ...
- Spark难道比oracle性能还差?百万级数据测试性能
本人对大数据方面也是刚刚研究,由于工作需要在实时查询与统计的性能方面要深入学习.现测试性能如下: 环境:VirtualBox host-only ubuntu版本: Linux master 4 ...
- javaweb中实现在线人数统计
session并不是浏览器关闭时销毁的,而是在session失效的时候销毁下列代码就是监测session创建.销毁 package com.my.count; import javax.servlet ...
- JavaScript对UNIX时间戳的转换
<script type="text/javascript"> var timestamp = '1479886513'; var d = new Date(times ...
- Markdown示例
欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想 ...