一、runtime
什么是runtime?
指一个程序在运行(或者在被执行)的状态。也就是说,当你打开一个程序使它在电脑上运行的时候,那个程序就是处于运行时刻。在一些编程语言中,把某些可以重用的程序或者实例打包或者重建成为“运行库"。这些实例可以在它们运行的时候被连接或者被任何程序调用。
1> runtime是一套底层的C语言API(包含很多强大实用的C语言数据类型、C语言函数)
2> 实际上,平时我们编写的OC代码,底层都是基于runtime实现
3> runtime 是一个强大的C语言库,我们写代码的时候直接编写的时候就会调用
- 也就是说,平时我们编写的OC代码,最终都是转成了底层的runtime代码(C语言代码)
runtime有什么用?
1> 能动态产生一个类、一个成员变量、一个方法
2> 能动态修改一个类、一个成员变量、一个方法
3> 能动态删除一个类、一个成员变量、一个方法
常见的函数、头文件
#import <objc/runtime.h> : 成员变量、类、方法
Ivar : 成员变量
Method : 成员方法
Ivar * class_copyIvarList : 获得某个类内部的所有成员变量
Method * class_copyMethodList : 获得某个类内部的所有方法
Method class_getInstanceMethod : 获得某个实例方法(对象方法,减号-开头)
Method class_getClassMethod : 获得某个类方法(加号+开头)
method_exchangeImplementations : 交换2个方法的具体实现
#import <objc/message.h> : 消息机制
objc_msgSend(....)
二、给类别添加属性
#import <objc/runtime.h>
//添加NSTextAttachment的类别
@interface NSTextAttachment (emoji)
//类别中不能添加属性
//若要添加属性,就需要实现setter和getter方法
//通常都会用runtime中的方法来实现
@property (copy,nonatomic)NSString *chs;
@end
@implementation NSTextAttachment (emoji)
/** 重写set*/
-(void)setChs:(NSString *)chs{
// _chs = chs;//类别中使用通常的方法无法实现setter功能
//需要使用runtime 给对象挂载一个值
//用CHS key挂载一个对象
objc_setAssociatedObject(self, @"CHS", chs, OBJC_ASSOCIATION_COPY);
}
-(NSString *)chs{
//用CHS key取得挂载对象
return objc_getAssociatedObject(self, @"CHS");
}
@end
三、导入系统库文件的推荐方式
//@import 官方推荐的导入库的方式,不需要手动引入系统库,会自动帮我们引入
@import AssetsLibrary;