【iOS】关联属性存取数据

有时候我们需要在现有的类存放一些额外的信息,通常的做法是继承一个子类,然后定义新增加的属性,然而如果我们为每个需要的类都添加一个类显得太麻烦了,objc提供了一个关联属性的特性,可以给一个对象关联一个属性(做过.NET的朋友一定熟悉附加属性,objc的关联属性与.NET的附加属性有点类似类似)

使用关联属性很简单,下面是几个主要的函数

//设置关联属性
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

//获取关联属性
id result = objc_getAssociatedObject(id object, const void *key)

//删除所有附加属性
objc_removeAssociatedObjects(id object)

我们声明属性的时候会声明:copy,retain,assign 内存管理方式,在设置关联属性的时候也有,即 objc_setAssociatedObject 的第四个参数

关联类型 等效@property属性

OBJC_ASSOCIATION_ASSIGN

assign

OBJC_ASSOCIATION_RETAIN_NONATOMIC


nonatomic, retain


OBJC_ASSOCIATION_COPY_NONATOMIC

nonatomic, copy

OBJC_ASSOCIATION_RETAIN

retain

OBJC_ASSOCIATION_COPY

copy

关联属性的附加相当于NSDictionary,通过键值对存储,但是有一点跟NSDictionary不一样的是,设置关联对象所用的键(key)是不透明指针(opaque pointer),NSDictionary判断两个Key的isEqual方法判断是否相等,而关联对象只判断两个key的地址是否相等,而不会比较对象具体的值

看看下面例子

    NSString *key1 = @"aaa";
    NSString *key2 = [NSString stringWithFormat:@"aaa"];
    NSString *key3 = @"bbb";

    NSObject *obj = [[NSObject alloc] init];

    objc_setAssociatedObject(obj, key1.UTF8String, @"aaa1", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    objc_setAssociatedObject(obj, key2.UTF8String, @"aaa2", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    objc_setAssociatedObject(obj, key3.UTF8String, @"bbb", OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    id value1 = objc_getAssociatedObject(obj, key1.UTF8String);
    id value2 = objc_getAssociatedObject(obj, key2.UTF8String);
    id value3 = objc_getAssociatedObject(obj, key3.UTF8String);

    NSLog(@"value1 = %@", value1);
    NSLog(@"value2 = %@", value2);
    NSLog(@"value3 = %@", value3);

输出

  这里的key1和key2都是@"aaa",但是取出来的value1和value2却不一样,这是因为key1和key2的地址不一样,在匹配的时候关联对象视为不同的key,所以通常我们在定义关联对象的key的时候使用静态全局变量作为键,这样可以保证地址一致

    static char *key = "aaa";
    NSObject *obj = [[NSObject alloc] init];

    objc_setAssociatedObject(obj, key, @"aaa1", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    objc_setAssociatedObject(obj, key, @"aaa2", OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    id value1 = objc_getAssociatedObject(obj, key);
    //把原有的值覆盖
    id value2 = objc_getAssociatedObject(obj, key);

    NSLog(@"value1 = %@", value1);
    NSLog(@"value2 = %@", value2);
时间: 2024-08-04 05:52:21

【iOS】关联属性存取数据的相关文章

三种iOS应用程序用户数据存储方法

本文通过偏好设置,plist文件,归档解档三种方法来演示iOS应用程序用户数据存储机制. 首先,我们创建一个Person类,并定义三个成员属性,用来存储数据 @property (nonatomic,copy) NSString *name; @property (nonatomic,assign)NSInteger age; @property (nonatomic,assign)BOOL isTrue; 一.通过偏好设置 1.通过偏好设置存储数据 //获取偏好设置的对象 NSUserDefa

李洪强iOS开发-网络新闻获取数据思路回顾

李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对象 1.2 单例的实现,设置baseURL,设置超时时长等 02 创建一个分类, 传入一个类的参数返回一个数组,返回当前类的所有属性 用在模型中处理模型数据 03 创建图片轮播模型(model)类发送请求获取轮播图片的数据  3.1 定义属性: 标题,图片 定义两个类方法: (1)传入一个字典的参数

iOS 常用四种数据存储方式

iOS 常用四种数据存储方式 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅, ,使得用户体验更好.下面介绍?一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前?一个方法告诉系统怎么对对象进行编码,而后?一个方法则是告诉系统怎么对对象进行解码.例如对Possession对

iOS狂暴之路---iOS中应用的数据存储方式解析

一.前言 前面一篇文章中已经介绍了iOS应用中的视图控制器知识点,而本文不会按照常理来介绍View的知识点,而是先介绍iOS中的数据存储知识点,因为关于View的知识点太多了,后面会连续详细介绍一下.这篇先来看一下iOS中的数据存储功能分析.每一个iOS应用和Android应用一样,都有其对应的沙盒存储自己的数据,但是iOS和Android有一个区别就在于没有SD卡的概念了,也就说在iOS中应用的数据只能保存到自己的沙盒中.这也可以看出来iOS为了应用的安全考虑. 在开发Android的时候都知

学习IOS开发UI篇--数据存储

iOS应用数据存储的常用方式 1.lXML属性列表(plist)归档 2.lPreference(偏好设置) 3.lNSKeyedArchiver归档(NSCoding) 4.lSQLite3 5.lCore Data Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该目录 tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除.应用没有运行时,系统也可能会清除该目录下的文件.iTunes同步设备时

iOS开发——网络篇&数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5

IOS TextField属性

原文请链接:http://blog.csdn.net/tskyfree/article/details/8121915/ //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef en

EF自动生成的(T4模板) 关联属性元数据修改

为了实现 T4模板关联属性 不要序列化的问题 就是要在具体的 关联属性上面添加一个元数据 这里利用以前的 Newtonsoft.Json 这个框架为例 效果应该为 就是要在关联属性上面添加元数据  [JsonIgnore] 注意: 默认会报错,如下 请记住错误个数,多了就证明你写的有问题.而且你不要奇怪有这么多错误. 如果你不出现这么多个错误提示,你就应该去找一下模板 如下的位置. 步骤 1.导入命名空间.不然出来的全是BUG //添加引用public string UsingDirective

前端页面存取数据

如果使用本地存储如:cookie,localStorage,sessionStorage,Web SQL的情况下,前端存取数据非常容易. 本文介绍,不使用以上本地存储,只在页面(标签里面)上存取数据. 最简单的一种做法是隐藏表单或者隐藏元素都可以: <div style="dispaly:none" class="data">${后台穿过来的数据}</div> 这种做法在获取数据的时,jquery选择器选择元素的时候比较麻烦.而且给页面增加了