关联对象

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

格而知之8:我所理解的Runtime(3)的更多相关文章

  1. 格而知之3:Core Data的基本使用

    最近准备做一个随手笔记类的app给自己用,考虑到从未使用过Core Data,就决定用Core Data来做数据存储.在网上参考了一些Core Data的资料后,用一天的时间写了这个demo,主要测试 ...

  2. 理解 Objective-C Runtime

    初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ObjC 特性 —— ObjC Runtime.这是因为这门语言很容易上手,几个小时就能学会怎么使用,所以程序员们往往会把时间都花 ...

  3. 理解Objective-C Runtime(四)Method Swizzling

    Objective-C对象收到消息之后,究竟会调用何种方法需要在运行期间才能解析出来.那你也许会问:与给定的选择子名称相应的方法是不是也可以在runtime改变呢?没错,就是这样.若能善用此特性,则可 ...

  4. 格而知之16:我所理解的Block(2)

    11.那么Block到底是怎么实现的呢?试一试通过将Block 的代码转换成普通C语言代码来查看它的实现过程. 要将OC代码转换成C语言代码,可以使用clang编译的一个命令: 通过这个命令能把指定文 ...

  5. 格而知之6:我所理解的Runtime(1)

    基本简介 1.根据官方文档,OC有一个特性:它会尽可能把一些决定从编译时和链接时推迟到运行时才处理,所以这门语言需要的就不只是一个编译器,它还需要一个runtime系统来处理那些已经被编译过的代码. ...

  6. 格而知之16:我所理解的Block(3)

    23.在前文中的例子中,Block结构体里的isa指针还没有详细讲解,这个指针都被置向了_NSConcreteStackBlock,它标识了Block的类型. 其实除了_NSConcreteStack ...

  7. 格而知之15:我所理解的Block(1)

    1.Block 本质上是一个struct结构体,在这个结构体中,最重要的成员是一个函数(当然除函数外还有其他重要的成员). 2.在开始解析Block之前,首先来回顾一下Block的格式.Block相关 ...

  8. 格而知之7:我所理解的Runtime(2)

    消息发送(Messaging) 8.以上便是runtime相关的一些数据结构,接下来我们回看一开始的疑问: objc_msgSend()函数在执行的过程中是如何找到对应的类,找到对应的方法实现的呢? ...

  9. 格而知之5:我所理解的Run Loop

    1.什么是Run Loop? (1).Run Loop是线程的一项基础配备,它的主要作用是来让某一条线程在有任务的时候工作.没有任务的时候休眠. (2).线程和 Run Loop 之间的关系是一一对应 ...

随机推荐

  1. Dalvik虚拟机简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...

  2. Git 推送分支

    1.推送本地分支到远程: git push origin master  推送本地分支 master 到 远程的 origin 上面   git push origin test 将本地分支test推 ...

  3. jquery 根据网站url给导航nav添加active效果

    后台的同事因为把nav公用了,所以无法单页添加active,一下方法通过判断url的后缀给当前页添加active $(function(){ var _nava= $('.nav .nav-wrapp ...

  4. php + apache + mysql

    http://archive.apache.org/dist/httpd/binaries/win32/   Apache msi 下载地址

  5. Cocoapods依赖管理

    对于iOS App的开发,几乎都采用了Cocoapods来管理第三方库,那么对于开发人员来说,这是必备技能,必须要掌握如何使用.这篇文章就是介绍如何安装和使用CocoaPods的. 简单来说,就是专门 ...

  6. Niagara AX之在Station下显示Home节点

    默认的Station下是没有Home节点的,那么,这个Home节点是怎么添加上去的呢? 注意Home后面的描述(Description):“Navigation tree defined by nav ...

  7. After a rest, go on

    busy during the whole May holiday. running between S and H, waste much time leaving things behind. t ...

  8. (原)下载pubFig的python代码

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5715305.html pubFig数据库网址: http://www.cs.columbia.edu/ ...

  9. python-整理--pip whl命令

    如果要在windows系统上安装新的包,可以下载*.exe安装文件,双击下一步...,如果找不到exe的话. 在CMD中执行 pip install 安装包文件.whl 就可以安装了 pip这个命令本 ...

  10. sql中NULL的问题

    sql中NULL的问题   今天一不小心在sql中写出以下脚本 select defaultPositionId from TableName where UserId=1100528 and def ...