关联对象

14、使用Category对类进行拓展的时候,只能添加方法,而不适合添加属性(可以添加属性,也可以正常使用get方法和set方法,只是不会自动生成以下划线开头命名的成员变量)。

可以通过关联对象(Associated Objects)来在Category里添加一个关联对象,然后将这个对象当做属性来看待使用,制造出“在Category中添加属性”的效果。

(1)、假设要在NSObject类的Category中添加一个关联对象,处理方法如下:

首先在@interface里照常添加属性associatedObject,然后在@implementation中,重写这个属性的set方法和get方法,在set方法里面使用objc_setAssociatedObject()函数关联上属性associatedObject,在get方法里使用objc_getAssociatedObject()函数获取属性associatedObject的值;

(2)、objc_setAssociatedObject()函数的4个参数分别是;关联的源对象、key、关联对象、关联方式。

key必须是一个唯一的常量,在上面的例子里使用了associatedObject这个方法的selector作为key,使用其他任何唯一的常量作为key也是可以的。

关联方式相当于属性的特性,所有的关联方式罗列如下:

objc_getAssociatedObject()函数的2个参数分别是:关联的源对象、key。

这个key必须和objc_setAssociatedObject()函数李的key一样,方能取出正确的值。

(3)、如上文一样为NSObject添加了一个关联属性后,执行以下代码:

输出如下:

等同于使用正常属性的效果。

方法交换(Method Swizzling

15、Method Swizzling可以在运行时将某个方法的实现替换成另一个方法的实现,这个技巧可以让你在不改动原方法的代码的前提下,对原方法的实现进行修改。

以下是一个在UIViewController类里交换了viewDidAppear:方法的例子。新建一个UIViewController类的分类(命名为Logging),然后在分类里重写+load方法,如下:

其中用来交换的方法命名为-swizzled_viewDidAppear:,定义如下:

交换函数swizzleMethod定义如下:

执行之后可以得到输出如下:

发现确实执行了我们自己定义的-swizzled_viewDidAppear:方法,说明已成功交换了两个方法的实现。

参考文档:

官方文档

https://github.com/samlaudev/RuntimeDemo

www.jianshu.com/p/25a319aee33d

最新文章

  1. swift三方库
  2. git项目开发版本控制实践
  3. atitit.提升开发效率---mda 软件开发方式的革命
  4. fibonacci 斐波那契数列
  5. android 定时执行一个任务
  6. JSON和JSONP有哪些区别,PhoneGap跨域请求如何实现
  7. 使用Windows Azure创建和发布ASP.NET应用程序
  8. httpd.ini
  9. Repository模式介绍汇总
  10. C语言宏的特殊用法和几个坑(转)
  11. IE6/IE7浏览器中"float: right"自动换行的解决方法
  12. redis 持久化与备份策略 【转载】
  13. 最近做的floyd的题目
  14. Python基础_函数2
  15. Java异常处理之try-with-resources
  16. linux java 安装
  17. WAR包方式安装Jenkins
  18. JSP本质的理解(浏览器调试,response里面的文本都是out.write写入网络流)
  19. 《数据库系统概念》10-ER模型
  20. HDU 1222 - Wolf and Rabbit & HDU 1108 - [最大公约数&最小公倍数]

热门文章

  1. iOS FMDB中的使用
  2. Subsequence(两个单调队列)
  3. Monkey Tradition(中国剩余定理)
  4. iOS tableView的图片缓存异步载入
  5. 笔记--cocos2d-x 3.0 环境搭建
  6. 2013年全球ERP市场格局(Gartner)
  7. java获取文件大小
  8. samba服务器加入域控主机所需要修改的配置文件
  9. [HeadFrist-HTMLCSS学习笔记][认识HTML中的“HT”]
  10. simplify the life ECMAScript 5(ES5)中bind方法简介