iOS中关联对象的简单使用objc_setAssociatedObject

首先看一下此方法接收的参数

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

被关联的对象,下面举的例子中关联到了UIAlertView

  • 要关联的对象的键值,一般设置成静态的,用于获取关联对象的值
  • 要关联的对象的值,从接口中可以看到接收的id类型,所以能关联任何对象
  • 关联时采用的协议,有assign,retain,copy等协议,具体可以参考官方文档

下面就以UIAlertView为例子简单介绍一下使用方法

使用场景:在UITableView中点击某一个cell,这时候弹出一个UIAlertView,然后在UIAlertView消失的时候获取此cell的信息,我们就获取cell的indexPath

第一步:

#import <objc/runtime.h>
static char kUITableViewIndexKey;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
......
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                message:@"这里是xx楼"
                                               delegate:self
                                      cancelButtonTitle:@"好的"
                                      otherButtonTitles:nil];
//然后这里设定关联,此处把indexPath关联到alert上
objc_setAssociatedObject(alert, &kUITableViewIndexKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[alert show];

}

第二步:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) {
    NSIndexPath *indexPath = objc_getAssociatedObject(alertView, &kUITableViewIndexKey);
    NSLog(@"%@", indexPath);
    }
}   
时间: 2024-11-03 21:41:14

iOS中关联对象的简单使用objc_setAssociatedObject的相关文章

IOS中复制对象的用法及深拷贝和浅拷贝详解

亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系. 课程内容简介 我们软件是基于移动设备的.所以我们必然的选择了安卓作为我们的开发工具.课程中,我们将简要的介绍Android的基本概念,然后进行我们的实战开发.在开发中,大家讲学习到基本的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的有用的知识点.通过课程学习,让大家能够掌握Android软件开发的流程,注意点,及优化.帮助大家迅速的掌握Andr

IOS 中block结构的简单用法

自从block出现之后,很多API都开始采用这样的结构,由此可见,block确实有许多优势存在,这里将一些简单用法总结如下: 一.如何声明一个block变量 我们通过^符号来声明block类型,形式如下: void (^myBlock)(); 其中第一个void是返回值,可以是任意类型,中间括号中^后面的是这个block变量的名字,我把它命名为myBlock,最后一个括号中是参数,如果多参数,可以写成如下样式: int (^myBlock)(int,int); 同样,你也可以给参数起名字: in

iOS runtime 关联对象(Associated Object)

?需求 同一个类有多个alertView, 不同的alertView 点击确定按钮 执行的方法不同 alertOne 点击 确定按钮 执行 methodOne, alertTwo 点击确定按钮 执行 methodTwo 常规做法 初始化并显示 alertOne - (IBAction)showAlertOne:(id)sender {     UIAlertView *alertOne = [[UIAlertView alloc]initWithTitle:@"AlertOne" me

iOS中僵尸对象的实现方法

什么是僵尸对象?所谓僵尸,就是过度释放的对象.在ios开发中,僵尸对象对于开发人员调试程序来说很有用.我们通常将NSZombieEnabled环境变量设置为YES来打开僵尸对象,但这会导致所有的对象都不会被释放,程序长时间运行会占用大量内存. 那有么有什么其他方法来实现僵尸对象呢?下面小编就给大家介绍下,模仿XCode用代码实现僵尸对象的方法. 创建僵尸对象 在ios开发中,当一个普通对象的retainCount变成0的时候,会调用dealloc,代码要勾住dealloc后,就可进行一下操作:

IOS中的数据存储 简单总结

1.  NSKeyedArchiver(加密形式) 2.  plist 3.  NSUserDefaults 4.  writeToFile 5.  SQLite3 ==== NSKeyedArchiver ======================================== -------CKPerson.h 代码 @interface CKPerson : NSObject @property (nonatomic, copy) NSString *name; @property

IOS中的__block关键字简单使用

/**13.__block什么时候用?**/ 结论:在block里面修改局部变量的值都要用__block修饰 /**14.请教一个问题:在block里面, 对数组执行添加操作, 这个数组需要声明成 __block吗?**/ 不需要声明成__block,因为testArr数组的指针并没有变(往数组里面添加对象,指针是没变的,只是指针指向的内存里面的内容变了) /**15.在block里面, 对NSInteger进行修改, 这个NSInteger是否需要声明成__blcok ?**/ NSInteg

iOS中让颜色赋值简单一点吧

在开发过程中,UE一般会给十六进制的颜色值,而如果RD同学每次都要去将十六进制进行转换,那太麻烦,这里写个预定义mark下. #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue &

iOS中 判断对象类型的一些方法

-(BOOL)  isKindOf:class 表示:对象是否为class或其父类 -(BOOL) isMemberOf:class 表示:对象是否为class -(BOOL) respondsToSelector:selector 表示:对象是否能够响应selector指定的方法 -(BOOL) instanceRespondToSelector:selector 表示:指定的对象是否能响应selector? -(BOOL) isSubclassOfClass:class 表示:对象是clas

iOS objc_setAssociatedObject 关联对象的学习

今天看了FDTemplateLayoutCell的源码,类别里面相当频繁使用了关联对象,做笔记!!!学套路 主要函数: void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); id objc_getAssociatedObject(id object, const void *key); void objc_removeAssociatedObjects