码迷,mamicode.com
首页 > 其他好文 > 详细

格而知之8:我所理解的Runtime(3)

时间:2016-07-07 11:01:46      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

关联对象

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:方法,说明已成功交换了两个方法的实现。

 

格而知之8:我所理解的Runtime(3)

标签:

原文地址:http://www.cnblogs.com/shayneyeorg/p/5649265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!