一、 简介

IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度。要想使用runtime,首先要引入系统的头文件。

<span style="font-size:18px;">#import <objc/runtime.h>
</span>

当我接触一样新的知识的时候,我比较喜欢先查看一下头文件,看看头文件里给我们提供了哪些接口。由于篇幅限制,我就偷个懒不往这里粘贴代码了。当我们查看runtime.h的时候,我们会发现,其实runtime是很有条理的。头文件主要给我们提供了4个类型(当然不止4种)的函数供我们使用。这4个类型分别以class、 method 、ivar、 objc加下划线开头。例如:

<span style="font-size:14px;">const char *object_getClassName(id obj)//获取对象的类名</span>
<span style="font-size:14px;">Ivar *class_copyIvarList(Class cls, unsigned int *outCount)//获取类的变量列表</span>
<span style="font-size:12px;"><span style="font-family: Menlo; color: rgb(4, 51, 255);">unsigned</span><span style="font-family: Menlo;"> </span><span style="font-family: Menlo; color: rgb(4, 51, 255);">int</span><span style="font-family: Menlo;"> method_getNumberOfArguments(</span><span style="font-family: Menlo; color: rgb(52, 149, 175);">Method</span><span style="font-family: Menlo;"> m)//获取函数变量的个数</span></span>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="font-size:12px;"><span style="color: rgb(4, 51, 255);">void</span> objc_setAssociatedObject(<span style="color: rgb(4, 51, 255);">id</span> object, <span style="color: rgb(4, 51, 255);">const</span> <span style="color: rgb(4, 51, 255);">void</span> *key, <span style="color: rgb(4, 51, 255);">id</span> value, <span style="color: rgb(52, 149, 175);">objc_AssociationPolicy</span> policy)//建立关联</span></p>

二、runtime 大招


     2.1)为已有的类添加属性

OC语法允许我们通过继承或者添加分类(category)修改(也不能说修改,就是改造成我们需要的类)已有的类。继承在这里不是我们想讨论的,主要是想说一下分类。分类可以允许我们添加属性(不会生成get和set方法,需要手动添加)和方法,但是却不允许我们添加成员变量。但是有些时候,我们需要添加一个变量来扩充这个类,比如:我有一个类Person类,带有age 和name 属性

#import <Foundation/Foundation.h>@interface DZLPerson : NSObject@property(nonatomic,weak)NSString *name;
@property(nonatomic,assign)NSInteger age;@end

但是,后来我们发现,仅仅这两个属性是不够描述的,我们还需要添加一个job属性来描述一个人。因此我们想到了用分类来添加属性。

<span style="font-size:14px;">#import "DZLPerson.h"@interface DZLPerson (Job)@property(nonatomic,copy)NSString* job;@end</span><span style="font-size:18px;">
</span>

但是事情往往没有那么简单,当我们运行程序时就会发现,程序崩溃了。

<span style="font-size:14px;">- (void)viewDidLoad
{[super viewDidLoad];DZLPerson *p=[[DZLPerson alloc] init];p.age=25;p.name=@"皮拉夫大王";p.job=@"ios";NSLog(@"%@",p);}</span>
<span style="font-size:14px;">2015-04-10 00:05:50.591 runtime讲解[4197:209347] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DZLPerson setJob:]: unrecognized selector sent to instance 0x7fe809f24790'</span>

程序提示我们:找不到setJob方法。这是理所当然的,因为系统不能为我们自动添加成员变量了,也就不知道该如何帮我们创建setter 和getter方法了。但是我们可以通过runtime来添加属性,使我们能够像真正的修改了Person类那样使用新的属性job。

首先在分类的.m 中导入runtime头文件,然后重写job的getter 和setter 方法。

<span style="font-size:14px;">#import "DZLPerson+Job.h"
#import <objc/runtime.h>static NSString *key=@"dzl"; //利用静态变量地址唯一不变的特性@implementation DZLPerson (Job)-(void)setJob:(NSString *)job
{objc_setAssociatedObject(self, &key, job, OBJC_ASSOCIATION_COPY);
}-(NSString *)job
{return objc_getAssociatedObject(self, &key);
}@end</span>

建立关联引用,将这个对象和我们所利用的唯一不变的地址进行关联,而关联则是job属性,这样的话由于建立关联的对象存在,所进行关联的键唯一,所以我们的属性也被唯一保存了,如同保存在对象自身上一样。如图所示:

通过关联引用我们就添加上了job 属性(叫属性有点不准确,如果可以的话我还是愿意叫它伪成员变量)。

转载于:https://www.cnblogs.com/dengzhuli/p/4415557.html

IOS高级开发 runtime(一)相关推荐

  1. IOS高级开发 runtime(一) (皮拉夫大王深夜原创)

    一. 简介 IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度.要想使用runtime,首先要引入系统的头文件. <span style="font-size:18p ...

  2. 《转载》IOS高级开发~开机启动无限后台运行监听进程

    非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...

  3. ios高级开发之多线程(一)

    1.概念: 多线程(multithreading)到底是什么呢,它是指在软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件的支持,而能够在同一时间执行多个线程,进而提升整体处理性 ...

  4. IOS高级开发~开机启动无限后台运行监听进程

    非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...

  5. IOS高级开发之多线程(五)NSOperation 2

    接着看NSOperation.NSOperationQueue线程间的通信: 应用场景:比如我们经常把一些耗时的操作比如下载图片放在子线程,那么当这个完成之后,我们就需要回到主线程,这个时候就需要用到 ...

  6. iOS 高级开发 KVC(一)

    转载地址:https://www.cnblogs.com/dengzhuli/p/4454516.html 熟练使用KVC 可以再开发过程中可以给我们带来巨大的好处,尤其是在json 转模型的时候,K ...

  7. iOS 高级开发 KVC(一),ios开发kvc

    http://www.bkjia.com/IOSjc/989396.html 熟练使用KVC 可以再开发过程中可以给我们带来巨大的好处,尤其是在json 转模型的时候,KVC让程序员摆脱了繁琐无营养的 ...

  8. IOS入门开发大概课程内容记录

    达内课程体系 第一阶段.Web开发基础(Linux操作系统.Nigix.XHTML技术核心.CSS技术核心):课程持续3周共96课时. 模块 课程目标 内容 项目 1 Mac Fundamental ...

  9. 《iOS 6高级开发手册(第4版)》——1.11节秘诀:获取和使用设备姿势

    本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的第1章,第1.11节秘诀:获取和使用设备姿势,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异 ...

最新文章

  1. SAP ME55 不能审批含有Delete Item的采购申请单据
  2. python 模块 wmi 远程连接 windows 获取配置信息
  3. Do not use built-in or reserved HTML elements as component id等等vue warn问题
  4. 什么镜头最适合拍风景_哪种镜头最适合你的街头摄影?
  5. StrongShop跨境电商系统源码 | 支持多语言多货币
  6. 02 超级搜索术——资源搜索:全面、快速查找全网你想要的任何信息、情报
  7. Android studio 导入项目运行
  8. aplay amixer arecord说明
  9. matlab 拉普拉斯金字塔,图像金字塔
  10. 网站建设以后如何处理死链接页面
  11. 威纶触摸屏485通信控制多台台达变频器程序
  12. python 录制网易云登陆_Github获8300星!用Python开发的一个命令行的网易云音乐
  13. 项目管理练习1577628224
  14. android如何编译lame,ndk编译android的lame库
  15. Android欢迎页面以及引导页面
  16. 【编程语言】Swift完全自学手册
  17. Java并发编程--线程池ThreadPollExecutor原理探究
  18. 亮度键消失、亮度键失灵且电脑亮度为最大 | 小米 | win11 | 解决办法最最最全合集
  19. HTML页面悬浮球,html滑动仿悬浮球菜单
  20. 武林大会之国产数据库风云榜-2021年11月

热门文章

  1. 外贸网络推广浅谈蜘蛛抓取频次的原则跟哪些有关?
  2. 做网络推广浅析影响网站打开速度的因素,促进网站SEO优化效果提升!
  3. 网络营销推广解答网站排名上下摇摆不定怎么办?
  4. 细节无处不在!东莞网络推广分享哪些操作会影响网站优化效果?
  5. “小米造车”终于尘埃落定,网络营销下“造车时代”终将到来
  6. 网站建设注重用户体验尤为重要
  7. java 注解生成实例_Java 8 开发的 Mybatis 注解代码生成工具
  8. 鸿蒙安卓翻版,鸿蒙是PPT、翻版安卓?对于黑粉:鸿蒙要失败了还有谁能成功?...
  9. linux oracle查询乱码问题,Linux环境Oracle显示乱码的解决方法
  10. 区块链带来的价值包括哪些_爱链社区干货:区块链技术为冷链物流带来的了那些价值?...