格而知之8:我所理解的Runtime(3)
关联对象
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
最新文章
- swift三方库
- git项目开发版本控制实践
- atitit.提升开发效率---mda 软件开发方式的革命
- fibonacci 斐波那契数列
- android 定时执行一个任务
- JSON和JSONP有哪些区别,PhoneGap跨域请求如何实现
- 使用Windows Azure创建和发布ASP.NET应用程序
- httpd.ini
- Repository模式介绍汇总
- C语言宏的特殊用法和几个坑(转)
- IE6/IE7浏览器中";float: right";自动换行的解决方法
- redis 持久化与备份策略 【转载】
- 最近做的floyd的题目
- Python基础_函数2
- Java异常处理之try-with-resources
- linux java 安装
- WAR包方式安装Jenkins
- JSP本质的理解(浏览器调试,response里面的文本都是out.write写入网络流)
- 《数据库系统概念》10-ER模型
- HDU 1222 - Wolf and Rabbit &; HDU 1108 - [最大公约数&;最小公倍数]
热门文章
- iOS FMDB中的使用
- Subsequence(两个单调队列)
- Monkey Tradition(中国剩余定理)
- iOS tableView的图片缓存异步载入
- 笔记--cocos2d-x 3.0 环境搭建
- 2013年全球ERP市场格局(Gartner)
- java获取文件大小
- samba服务器加入域控主机所需要修改的配置文件
- [HeadFrist-HTMLCSS学习笔记][认识HTML中的“HT”]
- simplify the life ECMAScript 5(ES5)中bind方法简介