动态的Objective-C——关于消息机制与运行时的探讨(四)

简介: 动态的Objective-C——关于消息机制与运行时的探讨

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

目录
相关文章
|
7月前
|
编译器 Swift iOS开发
44 Swift和Objective-C的运行时简介
Swift和Objective-C的运行时简介
45 0
|
iOS开发
动态的Objective-C——关于消息机制与运行时的探讨(三)
动态的Objective-C——关于消息机制与运行时的探讨
195 0
动态的Objective-C——关于消息机制与运行时的探讨(三)
|
iOS开发 开发者
动态的Objective-C——关于消息机制与运行时的探讨(二)
动态的Objective-C——关于消息机制与运行时的探讨
157 0
动态的Objective-C——关于消息机制与运行时的探讨(二)
|
缓存 自然语言处理 IDE
动态的Objective-C——关于消息机制与运行时的探讨(一)
动态的Objective-C——关于消息机制与运行时的探讨
151 0
动态的Objective-C——关于消息机制与运行时的探讨(一)
|
测试技术 C语言 iOS开发
|
存储 C语言 iOS开发
(转载)Objective-C总Runtime的那点事儿(一)消息机制
原文地址:http://www.cocoachina.com/ios/20141018/9960.html 找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题。
969 0
|
iOS开发 编译器 C语言
objective-c下的消息机制
l   消息机制:   Objective-c下调用函数并不是采用的想C语言中的函数调用机制而是使用的一种消息传递的机制。下文将讨论这两种协议之间的区别。   传统的函数调用机制是在程序编译的阶段就已经将子函数的引用地址编译进了执行代码,所以当编译完成之后,函数名指向的就是函数的入口地址,而调用函数将直接导向至函数的入口地址,从而直接开始执行函数。   而Objective-c采用的
963 0
|
Android开发 iOS开发
利用Objective-C运行时hook函数的三种方法
方法一,hook已有公开头文件的类: 首先写一个Utility函数: #import void exchangeMethod(Class aClass, SEL oldSEL, SEL newSEL) { Method oldMethod ...
1199 0