美文网首页
Runtime函数库中关于属性与变量的函数使用

Runtime函数库中关于属性与变量的函数使用

作者: 苏沫离 | 来源:发表于2019-01-10 00:08 被阅读0次

Runtime 函数库提供了很多函数用于一些操作,本篇主要总结关于属性Property 与变量的操作函数:

1、使用属性

/* 获取属性的名称
 */
const char * _Nonnull property_getName(objc_property_t _Nonnull property);

/* 获取属性的特征
 */
const char * _Nullable property_getAttributes(objc_property_t _Nonnull property);

/* 获取属性的特征数组。
 * @param outCount 特征数组的元素数量
 * @return 必须使用 free() 函数释放
 */
objc_property_attribute_t * _Nullable property_copyAttributeList(objc_property_t _Nonnull property,unsigned int * _Nullable outCount);

/* 获取指定特征的值。
 * @param attributeName 指定特征名称
 * @return 如果它不存在于属性中则为nil。
 */
char * _Nullable property_copyAttributeValue(objc_property_t _Nonnull property,const char * _Nonnull attributeName);

2、关联属性

/* 关联引用时的一些选项
 */
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,           //指定对关联对象的弱引用。
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //指定对关联对象的强引用;这种关联不是原子性的。
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   //指定复制关联的对象;这种关联不是原子性的。
    OBJC_ASSOCIATION_RETAIN = 01401,       //指定对关联对象的强引用;这种关联是原子性的。
    OBJC_ASSOCIATION_COPY = 01403          //指定复制关联的对象;这种关联是原子性的。
};

/* 使用指定键和关联选项为指定对象设置关联值。
 * @param object 关联的实例对象。
 * @param key 关联的键
 * @param value 关联的键对应的值;传递 nil 以清除现有关联。
 * @param policy 关联的选项
 */
void objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                              id _Nullable value, objc_AssociationPolicy policy);

/* 获取与指定对象关联的指定键的值。
 * @param object 关联的实例对象。
 * @param key 关联的键
 * @return 与对象的键键关联的值。
 */
id _Nullable objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key);

/* 移除指定对象的所有关联。
 * @note 该函数的主要目的是使指定对象很容易返回到“原始状态”。
 *       不应该将此函数用于从对象中删除关联,因为它还会删除添加到对象中的关联。
 *        通常使用 objc_setAssociatedObject() 和 nil 值来清除关联。
 */
void objc_removeAssociatedObjects(id _Nonnull object);

3、关于变量 Ivar 的操作函数

/* 获取指定类的 指定实例变量 Ivar。
 * @param cls 指定实例对象所属的类
 * @param name 要获取的实例变量的定义名称
 * @return 一个指向 Ivar 数据结构的指针,该结构包含关于由名称指定的实例变量的信息。
 */ 
Ivar class_getInstanceVariable(Class cls, const char *name);

/* 获取指定类的 指定类变量 Ivar。
 * @param cls 指定类
 * @param name 要获取的类变量的定义名称
 */ 
Ivar class_getClassVariable(Class cls, const char *name);

/* 获取类的所有实例变量
 * @param cls 要检查的类。
 * @param outCount 返回数组的长度;如果为 NULL,则不返回长度。
 * @return 类型为Ivar的指针数组,描述类声明的实例变量。
 *         不包括由父类声明的任何实例变量。
 *          必须使用 free() 函数释放数组。
 * 
 *  如果类声明没有实例变量,或者 cls 为Nil,则返回 NULL 并 *outCount 值为 0。
 */ 
Ivar *class_copyIvarList(Class cls, unsigned int *outCount);

/* 获取实例变量的名称
 */
const char * _Nullable ivar_getName(Ivar _Nonnull v);

/* 获取实例变量的数据类型
 */
const char * _Nullable ivar_getTypeEncoding(Ivar _Nonnull v);

/* 获取实例变量的偏移量。
 * @note 对于id类型或其他对象类型的实例变量,调用 object_getIvar() 和 object_setIvar() ,而不是使用此偏移量直接访问实例变量数据。
 */
ptrdiff_t ivar_getOffset(Ivar _Nonnull v);


/* 获取一个指针,指向与实例给定对象一起分配的任何额外字节。
 * @param obj 一个 Objective-C 对象
 * @return 一个指针,指向用obj分配的任何额外字节。如果没有为obj分配任何额外字节,那么对返回指针的解引用就是未定义的。
 * @note 这个函数返回一个指针,指向与实例一起分配的任何额外字节(由class_createInstance指定,extraBytes>0)。
 *       该内存遵循对象的普通ivar,但可能与上一个ivar不相邻。
 * @note 返回的指针保证是指针大小对齐的,即使对象最后一个ivar后面的区域的对齐程度低于该值。
 *       永远不能保证对齐大于指针大小,即使对象最后一个ivar后面的区域比指针大小更对齐。
 * @note 在 garbage-collected 环境中,对内存进行保守扫描。
 */
void * _Nullable object_getIndexedIvars(id _Nullable obj);

相关文章

网友评论

      本文标题:Runtime函数库中关于属性与变量的函数使用

      本文链接:https://www.haomeiwen.com/subject/zhpwrqtx.html