Runtime函数库中关于协议Protocol的函数使用
2019-01-10 本文已影响0人
苏沫离
Runtime 函数库提供了很多函数用于一些操作,本篇主要总结关于协议Protocol
的操作函数:
/* 获取指定名称的协议。
* @return 如果找不到指定名称的协议,则为NULL。
* @note 这个函数获取运行时锁。
*/
Protocol * _Nullable objc_getProtocol(const char * _Nonnull name);
/* 返回运行时所有已知协议的数组。
* @param outCount 数组中的协议数量
* @return 必须使用free()释放数组。
* @note T这个函数获取运行时锁。
*/
Protocol * __unsafe_unretained _Nonnull * _Nullable
objc_copyProtocolList(unsigned int * _Nullable outCount);
/* 判断一个协议 proto 是否遵守了另一个协议 other
* @return 如果 proto 遵守 other,则为YES,否则为NO。
* @note 一种协议可以使用与类采用协议相同的语法来合并其他协议:
* 如: @protocol ProtocolName < protocol list >
* 尖括号中列出的所有协议都被认为是协议名称协议的一部分。
*/
BOOL protocol_conformsToProtocol(Protocol * _Nullable proto, Protocol * _Nullable other);
/* 判断两个协议是否相等。
* @return 如果 proto 与 other 相等,则为YES,否则为NO。
*/
BOOL protocol_isEqual(Protocol * _Nullable proto, Protocol * _Nullable other);
/* 获取协议的名称。
*/
const char * _Nonnull protocol_getName(Protocol * _Nonnull proto);
/* 获取指定协议的指定方法的方法描述结构。
* @param isRequiredMethod 指示 aSel 是否是必需实现的方法
* @param isInstanceMethod 指示 aSel 是否是实例方法
* @return 如果协议不包含指定的方法,则返回一个值为{NULL, NULL}的objc_method_description结构。
* @note 这个函数递归地搜索这个协议所遵循的任何协议。
*/
struct objc_method_description
protocol_getMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull aSel,
BOOL isRequiredMethod, BOOL isInstanceMethod);
/* 获取满足指定协议的指定规范的方法的方法描述数组。
* @param isRequiredMethod 指示返回的方法是否应该是必需的方法(传递YES以指定必需的方法)。
* @param isInstanceMethod 指示返回的方法是否应该是实例方法(传递YES以指定实例方法)。
* @param outCount 数组中元素的数量。
* @return 必须使用free()释放数组。如果协议声明没有满足规范的方法,则返回 NULL 并且 *outCount 指为 0。
* @note 不包括本协议所采用的其他协议中的方法。
*/
struct objc_method_description * _Nullable
protocol_copyMethodDescriptionList(Protocol * _Nonnull proto,BOOL isRequiredMethod,
BOOL isInstanceMethod,unsigned int * _Nullable outCount);
/* 获取指定协议的指定属性。
* @param proto 指定协议
* @param name 指定属性名称.
* @param isRequiredProperty YES 搜索必须属性,NO 搜索可选属性。
* @param isInstanceProperty YES 搜索实例属性,NO 搜索类属性。
* @return 如果 proto 的所有属性都不满足规范,则为NULL。
*/
objc_property_t _Nullable
protocol_getProperty(Protocol * _Nonnull proto,const char * _Nonnull name,
BOOL isRequiredProperty, BOOL isInstanceProperty);
/* 获取协议声明的必需实例属性的数组。
* @note 作用类似于 protocol_copyPropertyList2(proto, outCount, YES, YES);
*/
objc_property_t _Nonnull * _Nullable
protocol_copyPropertyList(Protocol * _Nonnull proto,unsigned int * _Nullable outCount);
/* 获取协议声明的属性数组。
* @param isRequiredProperty YES 返回必须属性,NO 返回可选属性。
* @param isInstanceProperty YES 返回实例属性,NO 返回类属性。
* @return 不包括本协议采用的其他协议声明的任何属性;
* 必须使用free()释放数组;如果协议声明没有匹配的属性,则返回 NULL 并且 *outCount 指为 0。
*/
objc_property_t _Nonnull * _Nullable
protocol_copyPropertyList2(Protocol * _Nonnull proto,unsigned int * _Nullable outCount,
BOOL isRequiredProperty, BOOL isInstanceProperty);
/* 获取协议所遵守的其它协议的数组。
* @return 必须使用free()释放数组;如果协议声明没有遵守其它协议,则返回 NULL 并且 *outCount 指为 0。
*/
Protocol * __unsafe_unretained _Nonnull * _Nullable
protocol_copyProtocolList(Protocol * _Nonnull proto,
unsigned int * _Nullable outCount);
/* 创建一个新的协议实例,该实例在注册 objc_registerProtocol() 之前不能使用
* @param name 要创建的协议的名称。
* @return 创建成功返回协议实例,如果已存在同名协议则返回 nil。
* @note 没有销毁的函数
*/
Protocol * _Nullable objc_allocateProtocol(const char * _Nonnull name);
/* 向 Runtime 注册新构造的协议:协议将准备好使用,并且在此之后是不可变的。
*/
void objc_registerProtocol(Protocol * _Nonnull proto);
/* 向协议中添加方法;此时该协议还没有注册
* @param name 要添加方法的选择器类型 SEL
* @param types 方法签名:方法的入参类型与返回值类型
* @param isRequiredMethod 必需实现的方法为 YES ,可选方法为 NO。
* @param isInstanceMethod 实例方法为 YES ,类方法为 NO。
*/
void protocol_addMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull name,
const char * _Nullable types,
BOOL isRequiredMethod, BOOL isInstanceMethod);
/* 将合并的协议添加到另一个协议:正在添加的协议还没有注册,而附加协议已经注册。
* @param proto 正在添加的协议还没有注册
* @param addition 附加协议已经注册
*/
void protocol_addProtocol(Protocol * _Nonnull proto, Protocol * _Nonnull addition);
/* 向协议添加属性:该协议还没有注册。
* @param name 添加属性的名称
* @param attributes 属性的特征数组
* @param attributeCount 属性的特征数量
* @param isRequiredProperty 如果属性(访问器方法)是必需实现的,则为 YES。
* @param isInstanceProperty 如果属性(访问器方法)是实例方法,则为 YES。
* 这是属性唯一允许的情况,因此,将其设置为NO将不会将属性添加到协议中。
*/
void protocol_addProperty(Protocol * _Nonnull proto, const char * _Nonnull name,
const objc_property_attribute_t * _Nullable attributes,
unsigned int attributeCount,
BOOL isRequiredProperty, BOOL isInstanceProperty);