iOS开发之Runtime关联属性

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

首先,推荐给大家一个非常好用的一个网站:

非盈利无广告开发者专用网址导航:http://www.dev666.com/

API介绍

我们先看看Runtime提供的关联API,只有这三个API,使用也是非常简单的:

/*** Sets an associated value for a given object using a given key and association policy.** @param object The source object for the association.* @param key The key for the association.* @param value The value to associate with the key key for object. Pass nil to clear an existing association.* @param policy The policy for the association. For possible values, see “Associative Object Behaviors.”** @see objc_setAssociatedObject* @see objc_removeAssociatedObjects*/void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)/*** Returns the value associated with a given object for a given key.** @param object The source object for the association.* @param key The key for the association.** @return The value associated with the key \e key for \e object.** @see objc_setAssociatedObject*/id objc_getAssociatedObject(id object, const void *key)/*** Removes all associations for a given object.** @param object An object that maintains associated objects.** @note The main purpose of this function is to make it easy to return an object*  to a "pristine state”. You should not use this function for general removal of*  associations from objects, since it also removes associations that other clients*  may have added to the object. Typically you should use \c objc_setAssociatedObject*  with a nil value to clear an association.** @see objc_setAssociatedObject* @see objc_getAssociatedObject*/void objc_removeAssociatedObjects(id object)


设置关联

实际上,我们几乎不会使用到objc_removeAssociatedObjects函数,这个函数的功能是移除指定的对象上所有的关联。既然我们要添加关联属性,几乎不会存在需要手动取消关联的场合。

对于设置关联,我们需要使用下面的API关联起来:

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

object:与谁关联,通常是传self参数说明:

  1. key:唯一键,在获取值时通过该键获取,通常是使用static const void *来声明
  2. value:关联所设置的值
  3. policy:内存管理策略,比如使用copy

获取关联值

如果我们要获取所关联的值,需要通过key来获取,调用如下函数:

id objc_getAssociatedObject(id object, const void *key)

object:与谁关联,通常是传self,在设置关联时所指定的与哪个对象关联的那个对象参数说明:

  1. key:唯一键,在设置关联时所指定的键

关联策略

我们先看看设置关联时所指定的policy,它是一个枚举类型,看官方说明:

/*** Policies related to associative references.* These are options to objc_setAssociatedObject()*/typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {OBJC_ASSOCIATION_ASSIGN = 0,           /**< Specifies a weak reference to the associated object. */OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object.*   The association is not made atomically. */OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied.*   The association is not made atomically. */OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.*   The association is made atomically. */OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.*   The association is made atomically. */};


OBJC_ASSOCIATION_ASSIGN:表示弱引用关联,通常是基本数据类型,如intfloat,非线程安全我们说明一下各个值的作用:

  1. OBJC_ASSOCIATION_RETAIN_NONATOMIC:表示强(strong)引用关联对象,非线程安全
  2. OBJC_ASSOCIATION_COPY_NONATOMIC:表示关联对象copy,非线程安全
  3. OBJC_ASSOCIATION_RETAIN:表示强(strong)引用关联对象,是线程安全的
  4. OBJC_ASSOCIATION_COPY:表示关联对象copy,是线程安全的

扩展属性

我们来写一个例子,扩展UIControl添加Block版本的TouchUpInside事件。

扩展头文件声明:

#import <UIKit/UIKit.h>typedef void (^HYBTouchUpBlock)(id sender);@interface UIControl (HYBBlock)@property (nonatomic, copy) HYBTouchUpBlock hyb_touchUpBlock;@end

扩展实现文件:

 

#import "UIControl+HYBBlock.h"#import <objc/runtime.h>static const void *sHYBUIControlTouchUpEventBlockKey = "sHYBUIControlTouchUpEventBlockKey";@implementation UIControl (HYBBlock)- (void)setHyb_touchUpBlock:(HYBTouchUpBlock)hyb_touchUpBlock {objc_setAssociatedObject(self,sHYBUIControlTouchUpEventBlockKey,hyb_touchUpBlock,OBJC_ASSOCIATION_COPY);[self removeTarget:selfaction:@selector(hybOnTouchUp:)forControlEvents:UIControlEventTouchUpInside];if (hyb_touchUpBlock) {[self addTarget:selfaction:@selector(hybOnTouchUp:)forControlEvents:UIControlEventTouchUpInside];}}- (HYBTouchUpBlock)hyb_touchUpBlock {return objc_getAssociatedObject(self, sHYBUIControlTouchUpEventBlockKey);}- (void)hybOnTouchUp:(UIButton *)sender {HYBTouchUpBlock touchUp = self.hyb_touchUpBlock;if (touchUp) {touchUp(sender);}}@end

 

非盈利无广告开发者专用网址导航:http://www.dev666.com/

 

 

转载于:https://my.oschina.net/u/2448717/blog/750607

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DecisionTree决策树算法及参数详解+实例+graphviz生成决策树

DecisionTree决策树大全 原文&#xff1a;http://ihoge.cn/2018/DecisionTree.html 利用信息墒判定先对那个特征进行分裂 信息墒是衡量信息不确定性的指标&#xff0c;信息墒公式&#xff1a; H(X)−∑x∈XP(x)log2P(x)其中P(x)表示事件x出现的概率。回到决策树的构建问题上…

穿皮裤放屁,裤子会鼓吗?真相看这里!

1 拉莫斯&#xff1a;没事儿&#xff0c;打今儿起我管你叫哥&#xff0c;你管我叫爸&#xff0c;咱俩各论各的。▼2 妈妈都是为了你好▼3 秃头女孩最后的倔强▼4 新浪OS&#xff1a;呼~太紧张了&#xff0c;放松下▼5 这什么鬼玩意儿&#xff1f;▼6 这到底是爱老婆&…

史上最强物理科普

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

直方图python高度_python – 子图中直方图的动画

normed 直方图的True参数使直方图绘制分布的密度.从the documentation开始&#xff1a; normed : boolean, optional If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)dbin), i.e., the integra…

Kubernetes:全面了解 Deployment

本文为作者的 Kubernetes 系列电子书的一部分&#xff0c;电子书已经开源&#xff0c;欢迎关注&#xff0c;电子书浏览地址&#xff1a;https://k8s.whuanle.cn【适合国内访问】https://ek8s.whuanle.cn 【gitbook】Deployment 是 Kubernetes 提供的一种自我修复机制来解决机器…

史上最冤!美国原子弹之父被骂了9年!最后他上台领奖,竟一把推开了总统.........

全世界只有3.14 % 的人关注了爆炸吧知识原子裂变不及人心善变“漫天奇光异彩&#xff0c;犹如圣灵逞威&#xff0c;祇有千只太阳&#xff0c;始能与它争辉。”1945年7月15日&#xff0c;奥本海默注视着远处的蘑菇云&#xff0c;想起了《摩诃婆罗多经&#xff1a;福者之歌》中的…

spring 基于java的配置

2019独角兽企业重金招聘Python工程师标准>>> 7.10 Classpath scanning and managed componets 文档地址: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-classpath-scanning 本章中大部分例子是用xml来指定配置元数据,以…

WPF 实现3D翻转倒计时控件~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇倒计时控件01—代码如下一、创建 NumberCardControl.xaml代码如下。<UserControl x:Cl…

Android之Android studio基本调试和快捷键

第一种调试方法: 如果APP是单进程,直接debug运行,如下图 第二种调试方法: 第二种就是调试当前已经处于运行状态下的App,这也是我们用的更多的一种调试手段,即 Attach debugger to Android process 。点击运行按钮右侧第三个按钮,弹出 Choose Process 窗口,选择对应的进…

Windows 2008 R2安装DHCP服务器问题及解决方法

错误一&#xff1a;0x80074E6F 指定的服务器已在目录服务中造成此错误的原因是DHCP服务器没有正常卸载&#xff0c;第二次安装就会报如下图错误解决方法1.卸载DHCP服务器2.重启服务器3.打开adsiedit.msc4.如下图展开到 CNNetServices5.删除CNYour ServerName6.重新安装DHCP服务…

免费动态域名解析

DDNS 顾名思义就是动态域名解析&#xff0c;让域名绑定在动态 IP 上&#xff0c;比如拨号上网的 ADSL 用户。国内的 DDNS 服务有花生壳和 3322.org 这种提供商&#xff0c;我一直在用花生壳的免费 DDNS&#xff0c;可是近期情况非常糟糕&#xff0c;我到北京以来&#xff0c;就…

2021 年 CNCF 和开源速度的年终报告

深入了解开发速度最快的项目&#xff0c;可以很好地表明哪些领域正在起飞&#xff0c;哪些平台可能在未来几个月和几年内取得成功。如何评估一个项目的活跃度&#xff0c;通常从这几个方面, commits, contributions, issues 和 pull requests&#xff0c;而使用气泡图是一种很巧…

清华姚班毕业生不配自信?张昆玮在豆瓣征女友,却被网友群嘲......

全世界只有3.14 % 的人关注了爆炸吧知识不要看脸好好说话没想到&#xff0c;清华也有被瞧不起的一天。上周&#xff0c;山西某网友在D瓣上发布了一则征友贴&#xff1a;总结下来&#xff0c;就是一句话&#xff1a;俺&#xff0c;一介俗人&#xff0c;二本教师&#xff0c;兼职…

python自带的函数有哪些_为什么说 Python 内置函数并不是万能的?

在Python猫的上一篇文章中&#xff0c;我们对比了两种创建列表的方法&#xff0c;即字面量用法 [] 与内置类型用法 list()&#xff0c;进而分析出它们在运行速度上的差异。在分析为什么 list() 会更慢的时候&#xff0c;文中说到它需要经过名称查找与函数调用两个步骤&#xff…

抽象类与接口比较

为什么80%的码农都做不了架构师&#xff1f;>>> 老生重谈&#xff0c;每次谈却有不同的收获。抽象类与接口联系 1、是什么 抽象类&#xff1a; public abstract class Door{public int height 250;public int width 150;void open(){System.out.print(&qu…

Prism源代码解析(IRegionManager)

概要本文主要介绍Prism的IRegionManager, 主要分析源代码的执行流程, 来介绍内部实现的几个核心接口调用过程。通过本文, 你可以熟练的掌握Prism当中以下接口的作用以及使用方法, 如下所示:IRgionManagerINavigationAwareINavigateAsyncIRegionNavigationServiceIConfirmNaviga…

Android后台强制结束进程,Application入口或者activity回调的是哪个方法?

问题描述dengdeng 解决方案1如果是系统强制结束&#xff0c;不会调用的 转载于:https://www.cnblogs.com/yiguobei99/p/4002126.html

日本的电视节目到底能有多特别?

1 是不是设计师忘了开扇窗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 路灯&#xff1a;&#xff1f;&#xff1f;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 当代大学生的真实水平&#xff08;素材来源网络&#xff0…