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

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

非盈利无广告开发者专用网址导航: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

iOS开发之Runtime关联属性相关推荐

  1. iOS开发之Runtime常用示例总结

    深度好文,转载自:https://github.com/lizelu/ObjCRuntimeDemo 经常有小伙伴私下在Q上问一些关于Runtime的东西,问我有没有Runtime的相关博客,之前还真 ...

  2. ios c语言编译环境搭建,iOS开发之runtime(一):runtime调试环境搭建

    本系列博客是本人的源码阅读笔记,如果有 iOS 开发者在看runtime的,欢迎大家多多交流.为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui20 ...

  3. iOS开发之runtime(16):设置/获取section数据详解

    背景 在前面的文章中,笔者有讲解如何设置以及获取一个section的数据,demo如下: #import <Foundation/Foundation.h> #import <dlf ...

  4. (0070)iOS开发之AVFoundation枚举属性注解

    转载: http://www.jianshu.com/p/5e56e35217bf 我们可以通过设置AVCaptureSession的一些属性来改变捕捉画面的质量 但是要注意:size相关的属性的时候 ...

  5. (0022)iOS 开发之@property的属性Weak Strong的深入学习

    最近做项目发现经常有一些疑惑,发现一些天天写的代码理解的不是很清楚,于是准备对一些问题进行彻底的总结.深究,以此夯实基础!记录在案. 1.@property 的介绍: 与@synthesize配对使用 ...

  6. iOS开发之TextView常用属性

    基本属性: //textView尺寸和位置let textViewWidth: CGFloat = 223let textViewHeight: CGFloat = 198let textViewTo ...

  7. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  8. iOS开发之Objective-C(面试篇)-李飞-专题视频课程

    iOS开发之Objective-C(面试篇)-132人已学习 课程介绍         这个系列,我会选取实际面试过程中会问到的难点问题.几乎都是在面试大公司或者技术要求比较高的公司会问到的问题.希望 ...

  9. ios开发之OC基础-类和对象

    ios开发之OC基础-类和对象 本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录 ...

最新文章

  1. 【51CTO学院三周年】遇到
  2. 【C】浅谈strcpy
  3. ORACLE 动态SQL中的多个单引号
  4. JVM中OutOFMemory和StackOverflowError异常代码
  5. 使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目
  6. 解决:-bash: unzip: command not found (Linux 中 unZip/Zip 的安装及使用)
  7. 数字签名时间戳服务器的原理
  8. 2017-2018-1 20155234 《信息安全系统设计基础》第13周学习总结
  9. matlab怎么画二维热力图_Tableau画日历热力图
  10. python命令行解析库——argparse库的使用
  11. python 项目发布会_发布会直播技术及业务实践
  12. 区块链 比特币 以太坊 hyperledger fabric智能合约比较 不同的区块链比较
  13. ​发那科机器人PROFINET 主站配置
  14. Uiautomator 2.0之UiObject2类学习小记
  15. 游戏对战平台研究终结篇【转】
  16. [安装fastfds中的nginx执行make命令报错]src/core/ngx_murmurhash.c:37:11: error
  17. Android tips(十二)--Android开发中使用矢量图
  18. 完美复刻小米路由器Misstar Tools(MT工具箱)BY:蜜罐版
  19. 豆豆趣事[2011年12月]
  20. P-R曲线与ROC曲线使用总结

热门文章

  1. 找出无序数组中最小的k个数(top k问题)
  2. 大数据小白系列——HDFS(1)
  3. Buildroot 龙芯1C支持指南
  4. 按键精灵如何调用Excel及按键精灵写入Excel数据的方法教程---入门自动操作表格...
  5. centos 6.3安装libmcrypt-2.5.8不成功解决方案
  6. sql查询从m到n的这几条记录
  7. ASP.NET性能优化之构建自定义文件缓存
  8. backgroundworder 简单使用
  9. keras训练完以后怎么预测_还在使用“龟速”的单显卡训练模型?动动手,让TPU节省你的时间...
  10. 高质量的期货研究报告去哪里找?