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);
上一篇 下一篇

猜你喜欢

热点阅读