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);
网友评论