博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Runtime整理(二)——Runtime包含的所有函数
阅读量:6292 次
发布时间:2019-06-22

本文共 11249 字,大约阅读时间需要 37 分钟。

Runtime整理(二)——Runtime包含的所有函数


runtime.h中的所有函数

Working with Instances

// 返回指定对象的一份拷贝id _Nullable object_copy(id _Nullable obj, size_t size);// 释放指定对象占用的内存id _Nullable object_dispose(id _Nullable obj);// 返回对象的类Class _Nullable object_getClass(id _Nullable obj);// 设置对象的类Class _Nullable object_setClass(id _Nullable obj, Class _Nonnull cls);// 返回指定对象是否是一个类对象BOOL object_isClass(id _Nullable obj);// 已知Ivar,获取对象中指定成员变量的值id _Nullable object_getIvar(id _Nullable obj, Ivar _Nonnull ivar);// 已知Ivar,设置对象中指定成员变量的值void object_setIvar(id _Nullable obj, Ivar _Nonnull ivar, id _Nullable value);// 已知Ivar,设置对象中指定成员变量的值(强引用)void object_setIvarWithStrongDefault(id _Nullable obj, Ivar _Nonnull ivar, id _Nullable value);// 设置对象中指定成员变量的值Ivar _Nullable object_setInstanceVariable(id _Nullable obj, const char * _Nonnull name, void * _Nullable value);// 设置对象中指定成员变量的值(强引用)Ivar _Nullable object_setInstanceVariableWithStrongDefault(id _Nullable obj, const char * _Nonnull name, void * _Nullable value);// 获取对象中指定成员变量的值Ivar _Nullable object_getInstanceVariable(id _Nullable obj, const char * _Nonnull name, void * _Nullable * _Nullable outValue);

Obtaining Class Definitions

// 通过类名字符串获取类(如果类未在runtime中注册,则调用类的处理回调,并再次确认类是否注册,如果确认未注册,再返回nil)Class _Nullable objc_getClass(const char * _Nonnull name);// 通过类名字符串获取类(如果类未在runtime中注册则返回nil)Class _Nullable objc_lookUpClass(const char * _Nonnull name);// 通过类名字符串获取类(如果找不到该类则杀死进程)Class _Nonnullobjc_getRequiredClass(const char * _Nonnull name);// 通过类名字符串获取该类的元类Class _Nullable objc_getMetaClass(const char * _Nonnull name);// 获取已注册的类定义列表int objc_getClassList(Class _Nonnull * _Nullable buffer, int bufferCount);// 创建并返回一个指向所有已注册类的指针列表Class _Nonnull * _Nullable objc_copyClassList(unsigned int * _Nullable outCount);

Working with Classes

// 获取类的类名const char * _Nonnull class_getName(Class _Nullable cls);// 判断一个是否是元类BOOL class_isMetaClass(Class _Nullable cls);// 获取类的父类Class _Nullable class_getSuperclass(Class _Nullable cls);// 设置一个类的父类Class _Nonnull class_setSuperclass(Class _Nonnull cls, Class _Nonnull newSuper);// 获取类版本号int class_getVersion(Class _Nullable cls);// 设置类版本号void class_setVersion(Class _Nullable cls, int version);// 获取实例大小size_t class_getInstanceSize(Class _Nullable cls);// 获取类中指定名称实例成员变量的信息Ivar _Nullable class_getInstanceVariable(Class _Nullable cls, const char * _Nonnull name);// 获取类成员变量的信息Ivar _Nullable class_getClassVariable(Class _Nullable cls, const char * _Nonnull name);// 获取成员变量列表Ivar _Nonnull * _Nullable class_copyIvarList(Class _Nullable cls, unsigned int * _Nullable outCount);// 获取实例方法Method _Nullable class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name);// 获取类方法Method _Nullable class_getClassMethod(Class _Nullable cls, SEL _Nonnull name);// 返回方法的具体实现IMP _Nullable class_getMethodImplementation(Class _Nullable cls, SEL _Nonnull name);IMP _Nullable class_getMethodImplementation_stret(Class _Nullable cls, SEL _Nonnull name);// 类实例是否响应指定的selectorBOOL class_respondsToSelector(Class _Nullable cls, SEL _Nonnull sel);// 获取所有方法列表Method _Nonnull * _Nullable class_copyMethodList(Class _Nullable cls, unsigned int * _Nullable outCount);// 返回类是否实现指定的协议BOOL class_conformsToProtocol(Class _Nullable cls, Protocol * _Nullable protocol);// 返回类实现的协议列表Protocol * __unsafe_unretained _Nonnull * _Nullable class_copyProtocolList(Class _Nullable cls, unsigned int * _Nullable outCount);// 获取指定的属性objc_property_t _Nullable class_getProperty(Class _Nullable cls, const char * _Nonnull name);// 获取属性列表objc_property_t _Nonnull * _Nullable class_copyPropertyList(Class _Nullable cls, unsigned int * _Nullable outCount);// 添加方法BOOL class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _Nullable types);// 替换方法的实现IMP _Nullable class_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _Nullable types);// 添加成员变量BOOL class_addIvar(Class _Nullable cls, const char * _Nonnull name, size_t size, uint8_t alignment, const char * _Nullable types);// 添加协议BOOL class_addProtocol(Class _Nullable cls, Protocol * _Nonnull protocol);// 为类添加属性BOOL class_addProperty(Class _Nullable cls, const char * _Nonnull name, const objc_property_attribute_t * _Nullable attributes, unsigned int attributeCount);// 替换类的属性void class_replaceProperty(Class _Nullable cls, const char * _Nonnull name, const objc_property_attribute_t * _Nullable attributes, unsigned int attributeCount);// 确定一个对象的内存区域是否可以被垃圾回收器扫描,以处理strong/weak引用,无需主动调用const uint8_t * _Nullable class_getIvarLayout(Class _Nullable cls);const uint8_t * _Nullable class_getWeakIvarLayout(Class _Nullable cls);void class_setIvarLayout(Class _Nullable cls, const uint8_t * _Nullable layout);void class_setWeakIvarLayout(Class _Nullable cls, const uint8_t * _Nullable layout);// 提供给CoreFoundation的tool-free bridging使用的方法Class _Nonnull objc_getFutureClass(const char * _Nonnull name);

Instantiating Classes

// 创建类实例id _Nullable class_createInstance(Class _Nullable cls, size_t extraBytes);// 在指定位置创建类实例id _Nullable objc_constructInstance(Class _Nullable cls, void * _Nullable bytes);// 销毁类实例void * _Nullable objc_destructInstance(id _Nullable obj);

Adding Classes

// 创建一个新类和元类Class _Nullable objc_allocateClassPair(Class _Nullable superclass, const char * _Nonnull name, size_t extraBytes);// 在应用中注册由objc_allocateClassPair创建的类void objc_registerClassPair(Class _Nonnull cls);// 用于KVO,不要自己调用Class _Nonnull objc_duplicateClass(Class _Nonnull original, const char * _Nonnull name, size_t extraBytes);// 销毁一个类及其相关联的类void objc_disposeClassPair(Class _Nonnull cls);

Working with Methods

// 获取方法名SEL _Nonnull method_getName(Method _Nonnull m);// 获取方法实现IMP _Nonnull method_getImplementation(Method _Nonnull m);// 获取方法的属性信息(包括返回值类型,参数类型等等信息)const char * _Nullablemethod_getTypeEncoding(Method _Nonnull m);// 获取方法的参数个数unsigned int method_getNumberOfArguments(Method _Nonnull m);// 获取参数的属性参数char * _Nullable method_copyArgumentType(Method _Nonnull m, unsigned int index);void method_getArgumentType(Method _Nonnull m, unsigned int index, char * _Nullable dst, size_t dst_len);// 获取返回值的类型void method_getReturnType(Method _Nonnull m, char * _Nonnull dst, size_t dst_len);char * _Nonnull method_copyReturnType(Method _Nonnull m);// 设置一个方法的实现IMP _Nonnull method_setImplementation(Method _Nonnull m, IMP _Nonnull imp);// 交换两个方法的实现void method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2);

Working with Instance Variables

// 获取变量名const char * _Nullable ivar_getName(Ivar _Nonnull v);// 获取变量类型描述const char * _Nullable ivar_getTypeEncoding(Ivar _Nonnull v);// 获取变量基地址偏移量ptrdiff_t ivar_getOffset(Ivar _Nonnull v);

Working with Properties

// 获取属性名const char * _Nonnull property_getName(objc_property_t _Nonnull property);// 获取属性的属性const char * _Nullable property_getAttributes(objc_property_t _Nonnull property);// 获取属性的属性列表objc_property_attribute_t * _Nullable property_copyAttributeList(objc_property_t _Nonnull property, unsigned int * _Nullable outCount);// 获取属性的属性值char * _Nullable property_copyAttributeValue(objc_property_t _Nonnull property, const char * _Nonnull attributeName);

Working with Protocols

// 根据字符串获取协议Protocol * _Nullable objc_getProtocol(const char * _Nonnull name);// 获取runtime中已知的所有协议列表Protocol * __unsafe_unretained _Nonnull * _Nullable objc_copyProtocolList(unsigned int * _Nullable outCount);// 返回一个协议是否遵守另一个协议。BOOL protocol_conformsToProtocol(Protocol * _Nullable proto, Protocol * _Nullable other);// 返回两个协议是否相等BOOLprotocol_isEqual(Protocol * _Nullable proto, Protocol * _Nullable other);// 获取协议名const char * _Nonnull protocol_getName(Protocol * _Nonnull proto);// 根据给定的协议、方法选择器和要求返回方法描述struct objc_method_description protocol_getMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull aSel, BOOL isRequiredMethod, BOOL isInstanceMethod);// 返回协议中符合给定要求的方法描述数组struct objc_method_description * _Nullableprotocol_copyMethodDescriptionList(Protocol * _Nonnull proto, BOOL isRequiredMethod, BOOL isInstanceMethod, unsigned int * _Nullable outCount);// 获取协议的指定属性objc_property_t _Nullable protocol_getProperty(Protocol * _Nonnull proto, const char * _Nonnull name, BOOL isRequiredProperty, BOOL isInstanceProperty);// 获取协议中的属性列表objc_property_t _Nonnull * _Nullable protocol_copyPropertyList(Protocol * _Nonnull proto, unsigned int * _Nullable outCount);objc_property_t _Nonnull * _Nullable protocol_copyPropertyList2(Protocol * _Nonnull proto, unsigned int * _Nullable outCount, BOOL isRequiredProperty, BOOL isInstanceProperty);// 获取协议遵守的所有协议Protocol * __unsafe_unretained _Nonnull * _Nullable protocol_copyProtocolList(Protocol * _Nonnull proto, unsigned int * _Nullable outCount);// 创建新的协议Protocol * _Nullable objc_allocateProtocol(const char * _Nonnull name);// 在运行时中注册新创建的协议void objc_registerProtocol(Protocol * _Nonnull proto);// 为协议添加方法void protocol_addMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull name, const char * _Nullable types, BOOL isRequiredMethod, BOOL isInstanceMethod);// 添加一个已注册的协议到协议中void protocol_addProtocol(Protocol * _Nonnull proto, Protocol * _Nonnull addition);// 为协议添加属性void protocol_addProperty(Protocol * _Nonnull proto, const char * _Nonnull name, const objc_property_attribute_t * _Nullable attributes, unsigned int attributeCount, BOOL isRequiredProperty, BOOL isInstanceProperty);

Working with Libraries

// 获取所有加载的Objective-C框架和动态库的名称const char * _Nonnull * _Nonnull objc_copyImageNames(unsigned int * _Nullable outCount);// 获取指定类所在动态库const char * _Nullable class_getImageName(Class _Nullable cls);// 获取指定库或框架中所有类的类名const char * _Nonnull * _Nullable objc_copyClassNamesForImage(const char * _Nonnull image, unsigned int * _Nullable outCount);

Working with Selectors

// 获取方法选择器的名字const char * _Nonnull sel_getName(SEL _Nonnull sel);// 向运行时系统注册一个方法选择器SEL _Nonnull sel_registerName(const char * _Nonnull str);// 判断两个方法选择器是否相等BOOL sel_isEqual(SEL _Nonnull lhs, SEL _Nonnull rhs);

Objective-C Language Features

// 在迭代期间检测到遍历对象发生了改变,则会插入该函数抛出异常void objc_enumerationMutation(id _Nonnull obj);// 设置出现上述异常时的处理块void objc_setEnumerationMutationHandler(void (*_Nullable handler)(id _Nonnull ));// 设置objc_msgForward的回调方法void objc_setForwardHandler(void * _Nonnull fwd, void * _Nonnull fwd_stret);// 创建一个指针函数的指针,该函数调用时会调用特定的blockIMP _Nonnull imp_implementationWithBlock(id _Nonnull block);// 返回与IMP(使用imp_implementationWithBlock创建的)相关的blockid _Nullable imp_getBlock(IMP _Nonnull anImp);// 解除block与IMP(使用imp_implementationWithBlock创建的)的关联关系,并释放block的拷贝BOOL imp_removeBlock(IMP _Nonnull anImp);// 加载弱引用指针引用的对象并返回id _Nullable objc_loadWeak(id _Nullable * _Nonnull location);// 存储__weak变量的新值id _Nullable objc_storeWeak(id _Nullable * _Nonnull location, id _Nullable obj);

Associative References

// 为对象设置关联对象void objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy);// 获取对象的关联对象id _Nullable objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key);// 移除对象的所有关联对象void objc_removeAssociatedObjects(id _Nonnull object);

Hooks for Swift

/* Hooks for Swift */// 拦截class_getImageName()的hook方法类型typedef BOOL (*objc_hook_getImageName)(Class _Nonnull cls, const char * _Nullable * _Nonnull outImageName);// 给class_getImageName()安装一个hook方法void objc_setHook_getImageName(objc_hook_getImageName _Nonnull newValue,objc_hook_getImageName _Nullable * _Nonnull outOldValue)

回顾


参考文章


转载地址:http://nocta.baihongyu.com/

你可能感兴趣的文章
!important 和 * ----hack
查看>>
聊天界面图文混排
查看>>
控件的拖动
查看>>
svn eclipse unable to load default svn client的解决办法
查看>>
Android.mk 文件语法详解
查看>>
QT liunx 工具下载
查看>>
内核源码树
查看>>
Java 5 特性 Instrumentation 实践
查看>>
AppScan使用
查看>>
Java NIO框架Netty教程(三) 字符串消息收发(转)
查看>>
Ucenter 会员同步登录通讯原理
查看>>
php--------获取当前时间、时间戳
查看>>
Spring MVC中文文档翻译发布
查看>>
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>
Linux 线程实现机制分析
查看>>
继承自ActionBarActivity的activity的activity theme问题
查看>>
设计模式01:简单工厂模式
查看>>