4.协议相关操作函数
//判断某个类是否遵守某个协议
BOOL class_conformsToProtocol(Class cls, Protocol *protocol);
//拷贝某个类的协议列表
Protocol * __unsafe_unretained *class_copyProtocolList(Class cls, unsigned int *outCount);
//动态向类中添加协议
BOOL class_addProtocol(Class cls, Protocol *protocol);
//通过协议名获取某个协议指针
Protocol *objc_getProtocol(const char *name);
//拷贝所有协议列表
Protocol * __unsafe_unretained *objc_copyProtocolList(unsigned int *outCount);
//判断某个协议是否继承于另一个协议
BOOL protocol_conformsToProtocol(Protocol *proto, Protocol *other);
//判断两个协议是否相同
BOOL protocol_isEqual(Protocol *proto, Protocol *other);
//获取协议名
const char *protocol_getName(Protocol *p);
//获取协议中某个函数的描述
/*
p:协议指针
aSel:方法选择器
isRequiredMethod:是否是必实现的
isInstanceMehod:是否是实例方法
*/
struct objc_method_description protocol_getMethodDescription(Protocol *p, SEL aSel, BOOL isRequiredMethod, BOOL isInstanceMethod);
//获取协议方法描述列表
struct objc_method_description *protocol_copyMethodDescriptionList(Protocol *p, BOOL isRequiredMethod, BOOL isInstanceMethod, unsigned int *outCount);
//获取协议中的属性描述
objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty);
//获取协议中的属性描述列表
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount);
//同上
objc_property_t *protocol_copyPropertyList2(Protocol *proto, unsigned int *outCount, BOOL isRequiredProperty, BOOL isInstanceProperty);
//获取适配协议列表
Protocol * __unsafe_unretained *protocol_copyProtocolList(Protocol *proto, unsigned int *outCount);
//创建一个协议
Protocol *objc_allocateProtocol(const char *name);
//进行协议注册
void objc_registerProtocol(Protocol *proto);
//向协议中添加一个方法描述
void protocol_addMethodDescription(Protocol *proto, SEL name, const char *types, BOOL isRequiredMethod, BOOL isInstanceMethod);
//向协议中添加另一个协议
void protocol_addProtocol(Protocol *proto, Protocol *addition);
//向协议中添加属性描述
void protocol_addProperty(Protocol *proto, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount, BOOL isRequiredProperty, BOOL isInstanceProperty);
协议实质也是一个Objective-C对象。
5.动态构建类实例相关函数
//动态创建一个类实例
/*
cls:类名
size_t:分配额外的内存 用来存放类定义之外的变量
*/
id class_createInstance(Class cls, size_t extraBytes);
//同上
id objc_constructInstance(Class cls, void *bytes);
//销毁一个实例
void *objc_destructInstance(id obj);
//动态定义一个类
/*
superClass:指定父类
name:类名
extraBytes:额外的内存空间
*/
Class objc_allocateClassPair(Class superclass, const char *name,size_t extraBytes);
//进行类的注册 需要注意 要添加属性 必须在注册类之前添加
void objc_registerClassPair(Class cls);
//销毁一个类
void objc_disposeClassPair(Class cls);
五、运行时的几点应用扩展
到此本篇文章终于要告一段落了,相信你如果能看到这里,你一定有超凡的耐心。但是切记Objective-C的消息机制配合运行时是可以给开发者极大的元编程自由,但是不适当的使用也会造成破坏性的后果。下面几篇博客从一些方面介绍了Runtime的几点应用,你可以从中管中窥豹,可见一斑。
1.runtime基础应用:https://my.oschina.net/u/2340880/blog/489072
2.使用runtime全局修改UILabel字体:https://my.oschina.net/u/2340880/blog/538356
3.使用runtime自动化归档:https://my.oschina.net/u/2340880/blog/514330
4.代码调试框架的设计:https://my.oschina.net/u/2340880/blog/504675