点按钮的时候,给alertView添加一个关联对象(被点击这个按钮),

objc_setAssociatedObject(alert, &kRepresentedObject,
sender,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);

在UIAlertViewDelegate中取出关联对象(被点击的按钮)

UIButton *sender = objc_getAssociatedObject(alertView,
&kRepresentedObject);
&kRepresentedObject到底是什么东西,
kRepresentedObject从哪里来
static const char kRepresentedObject;

为什么会用char??

主要代码如下 ,
#import "ViewController.h"
#import <objc/runtime.h> @implementation ViewController static const char kRepresentedObject;
#pragma mark - event response
/** 按钮事件 */
- (IBAction)doSomething:(id)sender {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Alert" message:nil
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
objc_setAssociatedObject(alert, &kRepresentedObject,
sender,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[alert show]; }
#pragma mark - UIAlertViewDelegate
/** UIAlertViewDelegate */
- (void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex {
UIButton *sender = objc_getAssociatedObject(alertView,
&kRepresentedObject);
self.buttonLabel.text = [[sender titleLabel] text];
}
@end

让我们再来看看其他关联对象是如何关联的

在分类中加入了几个属性

#import <Foundation/Foundation.h>
#import "XTableViewCellItem.h" @interface NSArray (YDTableSectionView) @property (nonatomic, strong) XTableViewCellItem *sectionHeaderItem; @property (nonatomic, strong) XTableViewCellItem *sectionFooterItem; @end @interface YDtableSectionView : UIControl @property (nonatomic, strong) XTableViewCellItem *sectionItem; @end

m文件中这样实现

#import "NSArray+YDTableSectionView.h"
#import <objc/runtime.h> @implementation NSArray (YDTableSectionView) - (void)setSectionHeaderItem:(XTableViewCellItem *)sectionHeaderItem
{
objc_setAssociatedObject(self, "sectionHeaderItem", sectionHeaderItem, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} - (XTableViewCellItem *)sectionHeaderItem
{
return objc_getAssociatedObject(self, "sectionHeaderItem");
} - (void)setSectionFooterItem:(XTableViewCellItem *)sectionFooterItem
{
objc_setAssociatedObject(self, "sectionFooterItem", sectionFooterItem, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} - (XTableViewCellItem *)sectionFooterItem
{
return objc_getAssociatedObject(self, "sectionFooterItem");
} @end

用的是

"sectionFooterItem"

而非

@"sectionFooterItem"

最上面用的是

static const char kRepresentedObject;
char kRepresentedObject;说是有是“”而非@“”
static 局部,本文件访问
const 常量,不变

ios 关联对象运用 objc_setAssociatedObject的更多相关文章

  1. iOS objc_setAssociatedObject 关联对象的学习

    今天看了FDTemplateLayoutCell的源码,类别里面相当频繁使用了关联对象,做笔记!!!学套路 主要函数: void objc_setAssociatedObject(id object, ...

  2. iOS Category 添加属性实现原理 - 关联对象

    iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...

  3. iOS开发--Runtime的简单使用之关联对象

    一.Runtime关联对象的方法简介: 在<objc/runtime.h>中,有三个关联的方法,分别是: objc_setAssociatedObject objc_getAssociat ...

  4. 关联对象 AssociatedObject 完全解析

    我们在 iOS 开发中经常需要使用分类(Category),为已经存在的类添加属性的需求,但是使用 @property 并不能在分类中正确创建实例变量和存取方法. 不过,通过 Objective-C ...

  5. Effective Objective-C 2.0 — 第10条:在既有类中使用关联对象存放自定义数据

    可以通过“关联对象”机制来把两个对象连起来 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系” 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难于 ...

  6. 使用关联对象(AssociatedObject)为UIButton添加Block响应

    在开发中,要给UIButton添加点击事件的话,通常的做法是这样的 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [ ...

  7. 如何理解iOS的“对象等同性”

    在iOS开发过程中,我们经常需要用到等同性来判断两个对象是否相等,通常我们会使用==来判断,但是这样比较出来的结果可能不是我们期望的:所以,一般我们会使用NSObject协议声明的isEqual方法来 ...

  8. obj-c编程19:关联对象

    对于一些无法子类化的实例对象来说,如果希望将一个对象与其绑定该如何做呢? 以下示例虚构了一个HyConsoleAlert类,User类将会使用该类在控制台显示定制的告警.如果User中包括多个Aler ...

  9. Runtime之成员变量&属性&关联对象

    上篇介绍了Runtime类和对象的相关知识点,在4.5和4.6小节,也介绍了成员变量和属性的一些方法应用.本篇将讨论实现细节的相关内容. 在讨论之前,我们先来介绍一个很冷僻但又很有用的一个关键字:@e ...

随机推荐

  1. Jquery跨域获得Json

    这两天用 Jquery 跨域取数据的时候,经常碰到 invalid label 这个错误,十分的郁闷,老是取不到服务器端发送回来的 json 值, 一般跨域用到的两个方法为:$.ajax 和$.get ...

  2. 如何在Ubuntu 14.04中安装最新版Eclipse

    想必很多开发人员都知道,Ubuntu 软件源中提供的并不是最新版本的 Eclipse,本教程就教大家如何在 Ubuntu 14.04 中快速安装 Eclipse 官方发布的最新版本. 到目前为止,Ec ...

  3. 亚博 Arduino智能小车实验报告

    亚博 Arduino智能小车实践报告 一.     程序安装准备 首先安装了Arduino板载USB转串口CH340驱动安装包, 若上述程序安装成功,则可以在我的电脑中找到相应的端口 本机端口号为CO ...

  4. python机器学习《入门》

    写在前面的废话: 好吧,不得不说鱼C的markdown文本编辑器挺不错的,功能齐全.再次感谢小甲鱼哥哥的python视频让我去年大三下学期的时候入门了编程,爱上了编程这门语言,由于是偏冷门的统计学,在 ...

  5. MATLAB代码加密生成.p文件

    代码就下面一句话: pcode yourfile.m 生成的 yourfile.p就是你的加密文件,别人是看不到代码的,调用和m文件调用一样.

  6. Jenkins进阶之自动发送邮件的Default Content设置模板

    分享一个简洁实用的Jenkins项目邮件管理系统的"Default Content"设置模板 配置如下: <h1><center><font colo ...

  7. Android Support Annotations :安卓注解快速上手

    我们都知道,安卓资源文件都是int类型的ID来保存其引用,通过注解类型,可以让我们在写代码的时候,及时发现参数类型的错误,避免潜在的BUG,如下: 我们通过@LayoutRes指定了参数必须要是R.l ...

  8. -webkit-overflow-scrolling:touch iosBug

    IOS8+  -webkit-overflow-scrolling:touch 会导致webview崩溃 解决方案 用js动态添加样式  比如: $("body").css(&qu ...

  9. Object C学习笔记13-Dictionary字典

    通过Array数组和Set集合的学习和理解,可以想象得到Dictionary也分为两种情况了,那就是可变和不可变两种类型的.的确如此,在Object C中提供了两个字典类,分别为NSDictionar ...

  10. js判断页面点击事件

    <input type="submit" name="sb1" id="sb1" onclick="queryclick() ...